为什么这种行为在重载
当我运行这个程序时,为什么它调用方法重载了字符串参数。
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
可以是任何类的实例,因此两种方法都是候选方法。 因为String
是Object
的子类,所以它肯定更具体。 因此调用String重载。
至于你的结束段落, null
不是任何instanceof
。 如果你以类似的方式编写了Object-overload方法,它也不会打印任何东西 – 所以这并不是Java应该选择一个重载还是另一个重载的有力证据。