13

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

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

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

4

3 回答 3

14

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

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

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

它清楚地记录在JLS中:

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

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

于 2013-02-23T23:05:53.080 回答
5

我同意关于选择最具体方法的现有评论。你可以强制你的 null 被视为一个对象引用,通过强制转换它来消除字符串参数方法的使用:

a.printToOut((Object)null);
于 2013-02-23T23:22:31.370 回答
4

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

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

JLS 15.12.2.5 的链接

于 2014-12-31T04:23:53.923 回答