将null传递给优先使用String的方法,而不是Object

我在我的程序中遇到了一个问题,我在下面的一个小代码片段中说清楚了。 任何人都可以解释为什么会这样吗?

class ObjectnullTest { public void printToOut(String string) { System.out.println("I am null string"); } public void printToOut(Object object) System.out.println("I am null object"); } class Test { public static void main(String args[]) { ObjectnullTest a = new ObjectnullTest(); a.printToOut(null); } } 

这总是打印I am null string

我想知道原因,以便我可以修改代码。

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

在编译时选择最具体的方法。

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

它清楚地记录在JLS中

第二步搜索上一步中为成员方法确定的类型。 此步骤使用方法的名称和参数表达式的类型来定位可访问和适用的方法,即可以在给定参数上正确调用的声明。

可能存在多于一种这样的方法,在这种情况下,选择最具体的方法。 最具体方法的描述符(签名加返回类型)是在运行时用于执行方法调度的方法。

我同意关于选择最具体方法的现有评论。 您可以强制将null视为Object引用,通过强制转换它来消除String参数方法的使用:

 a.printToOut((Object)null); 

请参阅jls的第15.12.2.5节,详细说明如何选择

在编译时选择最具体的方法