通过传递接口类型来调用函数

时间:2013-08-15 13:59:35

标签: java interface overloading

对于下面的代码,我无法理解如何调用重载函数 任何人都可以详细解释当对象分别使用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);
    }
}

2 个答案:

答案 0 :(得分:1)

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

  1. 所有java对象都来自Object。
  2. 您定义了界面侧
  3. Head implements Side
  4. Tail实施Side。
  5. 你有四个同名的方法(重载),但都有不同的签名......一个接受一个Head,另一个接受一个Tail,另一个接收一个Side,最后一个接受一个Object。由于Head和Tail都继承自Side,因此方法重载(Side side)将接受作为参数。类似地,由于Head和Tail都来自Object,因此重载(Object obj)也会接受。

    在您的特定示例中,firstAttempt的类型为Side,因此当您调用overload(firstAttempt)时,您正在使用重载(Side Side)方法。您的第二个调用显式转换为Object,因此您正在使用重载(Object obj)。您的secondAttempt变量的类型为Tail,因此重载(secondAttempt)会调用重载(尾部尾部)。最后,重载((Side)secondAttempt)显式地转换为Side,因此调用了重载(侧面)。

答案 1 :(得分: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);
}

在纸上逐行模拟主要功能的干运行 将代码映射到示例输出,如下所示:

对于 Side a = new Head()

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

对于 Side 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

Tail d = new Tail()

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

标记每个对象的引用相同,@ hashcode!

也是如此