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

时间:2013-02-23 23:04:10

标签: java string oop 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

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

3 个答案:

答案 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节,详细说明如何选择

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