我在我的程序中遇到了一个问题,我在下面用一个小代码片段说清楚了。任何人都可以解释为什么会这样吗?
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
。
我想知道原因,以便我可以修改代码。
答案 0 :(得分:12)
这是因为方法重载
在编译时选择最具体的方法。
因为'java.lang.String'比'java.lang.Object'更强特定类型。在您的情况下,选择以“String”作为参数的方法。
在JLS中明确记录:
第二步搜索上一步中确定的类型 成员方法。此步骤使用方法的名称和类型 用于查找可访问的方法的参数表达式 适用的,即可以正确调用的声明 在给定的论点上。
可能有不止一种这样的方法 在哪种情况下选择最具体的一个。描述符(签名 加返回类型)最具体的方法是在运行时使用的方法 执行方法调度。
答案 1 :(得分:5)
我同意关于选择最具体方法的现有评论。您可以强制将null视为Object引用,通过强制转换它来消除String参数方法的使用:
a.printToOut((Object)null);
答案 2 :(得分:2)
请参阅jls的第15.12.2.5节,详细说明如何选择
在编译时选择最具体的方法