【问题标题】:Java - Method picking algorithm [duplicate]Java - 方法选择算法
【发布时间】:2015-03-11 21:26:56
【问题描述】:

我在搞乱方法并正在寻找,如果我创建两个名为“hello”的方法,使用不同的对象并将“null”传递给方法,将执行哪个方法:

    public static void main(String... args) {
        hello(null);
    }

    public static void hello(Window w) {
        System.out.println("Hello");
    }

    public static void hello(Frame f) {
        System.out.println("Bye");
    }

每次输出都是“Bye”,但我还是不明白这背后的逻辑。 在谷歌进行了简短的研究后,没有任何解释,我决定在这里问这个问题。

希望有人能解释一下选择算法或者给我一个解释的链接。

【问题讨论】:

    标签: java methods compiler-construction


    【解决方案1】:

    编译器更喜欢最专业的类型:

    public class Parent {
        public static void main(String... args) {
            hello(null); // takes `Child`
        }
    
        public static void hello(Parent _) {
            System.out.println("SuperClass");
        }
    
        public static void hello(Child _) {
            System.out.println("SubClass");
        }
    }
    
    class Child extends Parent {
    
    }
    

    原因,看看this thread,@Hayden 在他的评论中已经提到了。

    【讨论】:

    【解决方案2】:

    Java 将选择提供的两种方法中最具体的一种(参见Java Language Specification

    如果多个成员方法既可访问又适用于 方法调用,需要选择一个来提供 运行时方法分派的描述符。 Java 编程 语言使用选择最具体方法的规则。

    Frame 的类层次结构是

    java.lang.Object
        java.awt.Component
            java.awt.Container
                java.awt.Window
                    java.awt.Frame
    

    Window 的类层次结构是

    java.lang.Object
        java.awt.Component
            java.awt.Container
                java.awt.Window
    

    Frame 是最具体的方法,然后,您的public static void hello(Frame f) 将被选中。

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2016-06-09
      • 2018-05-20
      相关资源
      最近更新 更多