为什么这种行为在重载

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

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

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

 The most specific method is choosen at compile time. 

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

DOCS中明确提到

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

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

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

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