2013-02-23 39 views
8

我在我的程序中遇到了一个问题,我用下面的一个小代码片断说明了问题。任何人都可以解释为什么会发生?将null传递给喜欢使用字符串的方法,而不是对象

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

[对NULL参数方法重载]的可能重复(http://stackoverflow.com/questions/5229809/method-overloading-for-null-parameter) – jlordo 2013-02-23 23:05:45

+0

许多choosen其他人,请参阅[http://stackoverflow.com/search?q=%5Bjava%5D+overloading+null](http://stackoverfl ow.com/search?q=%5Bjava%5D+overloading+null) – jlordo 2013-02-23 23:08:04

+0

对不起,相同的标准问题,无法找到适当的关键词。 – 2013-02-23 23:11:46

回答

11

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

最具体方法是在编译时choosen。

由于'java.lang.String'是一个比'java.lang.Object'更具体的。在你的情况下,选择'String'作为参数的方法。

其明确记载在JLS

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

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

5

我同意关于选择最具体方法的现有评论。你可以强迫你的空被视为一个对象引用,避免使用字符串参数的方法,通过铸造它:

a.printToOut((Object)null); 
2

请参阅JLS,在细节给第15.12.2.5如何选择

最具体方法是在编译时

相关问题