将 null 传递给首选 String 的方法,而不是 Object

2022-09-04 08:18:26

我的程序中遇到了一个问题,我在下面用一个小代码片段清楚地说明了这一点。谁能解释为什么会发生这种情况?

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

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


答案 1

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

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

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

它在JLS中清楚地记录:

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

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


答案 2

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

a.printToOut((Object)null);