为什么这种行为在重载

时间:2013-04-24 07:42:48

标签: java

当我运行这个程序时,为什么它调用方法重载了字符串参数。

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的实例,那么它为什么以这种方式调用呢?

3 个答案:

答案 0 :(得分:3)

t因为在方法重载的情况下

The most specific method is choosen at compile time.

因为'java.lang.String'是比'java.lang.Object'更具体的类型。在您的情况下,选择“String”作为参数的方法。

DOCS

中明确提到

答案 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可以是任何类的实例,因此两种方法都是候选方法。由于StringObject的子类,因此它更具体。因此调用String重载。

关于结束段落,null不是instanceof。如果您以类似的方式编写了Object-overload方法,那么就不会打印任何东西 - 所以这并不是Java应该选择一个重载还是另一个重载的有力证据。