当我运行这个程序时,为什么它调用方法重载了字符串参数。
public class StaticBindTest {
public static void main(String args[]) {
StaticBindTest et = new StaticBindTest();
et.sort(null);
}
//overloaded method
public void sort(Object c){
System.out.println("Inside Collection sort method");
}
//another overloaded method
public void sort(String hs){
System.out.println("Inside HashSet sort method");
}
}
如果我重写我的方法
public void sort(String hs){
if(hs instanceof String)
System.out.println("Inside HashSet sort method");
}
它会显示空白控制台,这意味着它不是String的实例,那么它为什么以这种方式调用呢?
答案 0 :(得分:3)
t因为在方法重载的情况下
The most specific method is choosen at compile time.
因为'java.lang.String'是比'java.lang.Object'更具体的类型。在您的情况下,选择“String”作为参数的方法。
中明确提到答案 1 :(得分:1)
当我执行你的代码时,我发现Inside HashSet sort method
在输出中。 null
是对象的空引用。两种方法都将Object作为输入,这就是为什么调用具有更窄层次结构String
的方法的原因。
不要写StaticBindTest et = new StaticBindTest();
只需在没有对象sort(null)
的情况下致电et
。
答案 2 :(得分:0)
完整的方法论在section 15.12.2 of the JLS中解释,特别是15.12.2.5(选择最具体的)。
总结是Java总是选择适用的最具体的重载。由于null
可以是任何类的实例,因此两种方法都是候选方法。由于String
是Object
的子类,因此它更具体。因此调用String重载。
关于结束段落,null
不是instanceof
。如果您以类似的方式编写了Object-overload方法,那么也就不会打印任何东西 - 所以这并不是Java应该选择一个重载还是另一个重载的有力证据。