【问题标题】:Calling functions by passing interface type通过传递接口类型调用函数
【发布时间】:2013-08-15 13:59:34
【问题描述】:

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

【问题讨论】:

  • 你试过调试模式吗?
  • 目前还不清楚您到底对什么感到困惑。你给overload打了四次电话——哪个电话让你感到困惑,以什么方式?
  • 调用重载(第一次尝试)让我感到困惑,因为 Side firstattempt=new Head()

标签: java interface overloading


【解决方案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)。

【讨论】:

    【解决方案2】:

    小块地消化概念!

    先了解这段代码

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

    它创建了一个接口,两个类实现了它。覆盖函数。 然后是你的最后一堂课,

    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
    

    对于 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 也是如此!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2018-03-14
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      相关资源
      最近更新 更多