1

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

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

4

3 回答 3

3

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

The most specific method is choosen at compile time.

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

DOCS中明确提到

于 2013-04-24T07:45:32.530 回答
1

当我执行你的代码时,我发现Inside HashSet sort method它在输出中。null是对对象的空引用。这两种方法都将 Object 作为输入,这String就是调用具有更窄层次结构的方法的原因。
不要写 StaticBindTest et = new StaticBindTest();
Just call sort(null)without object et

于 2013-04-24T07:47:48.927 回答
0

完整的方法在 JLS 的第 15.12.2 节中进行了解释,特别是第 15.12.2.5 节(选择最具体的)。

总结是 Java 总是选择适用的最具体的重载。由于null可以是任何类的实例,因此这两种方法都是候选方法。既然String是 的子类Object,它肯定更具体。因此调用了 String 重载。

至于你的最后一段,null不是instanceof什么。如果您以类似的方式编写了 Object-overload 方法,它不会打印任何内容 - 所以这不是 Java 是否应该选择一个重载或另一个的有力证据。

于 2013-04-24T07:47:43.327 回答