-4

对于下面的代码,我无法理解对重载函数的调用是如何进行的,谁能给我一个详细的解释,当分别使用 Side 和 Tail 引用创建对象时,如何进行重载函数调用。

interface Side {
    String getSide();
}

class Head implements Side {
    public String getSide() {
        return "Head ";
    }
}

class Tail implements Side {
    public String getSide() {
        return "Tail ";
    }
}

class Coin {
    public static void overload(Head side) {
        System.out.print(side.getSide());
    }

    public static void overload(Tail side) {
        System.out.print(side.getSide());
    }

    public static void overload(Side side) {
        System.out.print("Side ");
    }

    public static void overload(Object side) {
        System.out.print("Object ");
    }

    public static void main(String[] args) {
        Side firstAttempt = new Head();
        Tail secondAttempt = new Tail();
        overload(firstAttempt);
        overload((Object) firstAttempt);
        overload(secondAttempt);
        overload((Side) secondAttempt);
    }
}
4

2 回答 2

1

http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

  1. 所有java对象都来自Object。
  2. 你定义了接口 Side
  3. 头部工具侧面
  4. 尾实现侧。

您有四个具有相同名称(重载)的方法,但它们都有不同的签名……一个接受 Head,另一个接受 Tail,另一个接受 Side,最后一个接受 Object。由于 Head 和 Tail 都继承自 Side,因此方法重载(Side side)将接受任何一个作为参数。同样,由于 Head 和 Tail 都来自 Object,因此重载(Object obj)将接受其中任何一个。

在您的具体示例中,firstAttempt 是 Side 类型,因此当您调用重载(firstAttempt)时,您使用的是重载(Side side)方法。您的第二次调用显式转换为 Object,因此您使用的是重载(Object obj)。您的 secondAttempt 变量是 Tail 类型,因此重载(secondAttempt)调用重载(尾尾)。最后,重载((Side) secondAttempt) 显式转换为 Side,因此调用了重载(Side side)。

于 2013-08-15T14:09:54.100 回答
1

小块消化这个概念!

先理解这段代码

interface Side
{
String getSide();
}

class Head implements Side
{
public String getSide()
{
    return "Head ";
}
}

class Tail implements Side
{
public String getSide()
{
    return "Tail ";
}
}

它创建了一个接口,并有 2 个类实现了它。覆盖函数。然后你的期末课,

public class Coin
{
public static void overload(Head side)
{
    System.out.println(side.getSide()+" -> "+side);
}

public static void overload(Tail side)
{
    System.out.println(side.getSide()+" -> "+side);
}

public static void overload(Side side)
{
    System.out.println("Side <- "+side);
}

public static void overload(Object side)
{
    System.out.println("Object <- "+side);
}
public static void main(String[] args)
{
    Side a = new Head();
    Side b = new Tail();
    Head c = new Head();
    Tail d = new Tail();
    overload(a);
    overload((Side) a);
    overload((Object) a);
    overload(b);
    overload((Side) b);
    overload((Object) b);
    overload(c);
    overload((Side) c);
    overload((Object) c);
    overload(d);
    overload((Side) d);
    overload((Object) d);
}

在纸上逐行模拟主函数的空运行,将代码映射到示例输出,如下所示:

对于边 a = new Head()

Side <- Head@12d5e310
Side <- Head@12d5e310
Object <- Head@12d5e310

对于边 b = new Tail()

Side <- Tail@182e3919
Side <- Tail@182e3919
Object <- Tail@182e3919

对于Head c = new Head()

Head  -> Head@2a6a4b6
Side <- Head@2a6a4b6
Object <- Head@2a6a4b6

对于尾 d = new Tail()

Tail  -> Tail@a87aa16
Side <- Tail@a87aa16
Object <- Tail@a87aa16

标记每个对象的引用是相同的,@hashcode 也是如此!

于 2013-08-19T18:42:39.740 回答