传递null时,在重载期间将调用哪个方法

时间:2013-10-18 15:05:43

标签: java overloading

在以下程序中:

public class PolyEx1 {
    public static void main(String[] args) {
    A refA = new A();
        refA.method1(null);
    }
}

class A {
    public void method1(Object o) {
        System.out.println("o");
    }

    public void method1(String str) {
        System.out.println("str");
    }
}

输出是“str”,有人能解释我为什么打印str?我无法理解这一点。

3 个答案:

答案 0 :(得分:2)

正如Rohit here所解释的那样,

  

这是因为String类从Object扩展,因此更多   特定于对象。因此,编译器决定调用该方法。   请记住,编译器总是选择最具体的方法来调用。

     

如果多个成员方法都可访问且适用于a   方法调用,有必要选择一个提供   运行时方法调度的描述符。 Java编程   language使用选择最具体方法的规则。

     

非正式的直觉是一种方法更具体   如果可以传递第一个方法处理的任何调用,则为另一个   没有编译时类型错误的另一个。

     

但是,如果你有两个带参数的方法 - String和Integer,   然后你会得到null的歧义错误,因为编译器无法决定   哪一个更具体,因为它们是非协变类型。

     

如JLS的15.12.5部分所述

答案 1 :(得分:1)

Java尝试使用方法的最具体适用版本。

String扩展Object,因此始终会调用使用String作为参数的方法。

如果您尝试添加一个采用Integer输入的方法,它会将错误视为不明确的方法,因为StringInteger两者都比Object更具体,但没有一个是比另一个更具体

答案 2 :(得分:0)

public void method1(String str)将被执行,因为object是字符串supperclass,因此将调用字符串方法。