2014-09-06 45 views
4

我是Java的新学习者。我想了解在函数和函数重载中传递参数的概念。我在java网站上发现了几个例子,其中给出了下面的代码,我怀疑如果将null传递给nh(),那么在输出中显示“string”的方式。下面是代码JAVA中函数重载的困惑

public class CLI_APP 
{ 
    public static void main(String[] args) 
    { 
     jh(null); 
    } 
    public static void jh(String s) 
    { 
     System.out.print("String"); 
    } 
    public static void jh(Object o) 
    { 
     System.out.print("Object"); 
    } 
} 

在相同的代码,如果下面的行添加

public static void jh(Integer s) 
{ 
    System.out.print("Integer"); 
} 

我的

的编译错误 “方法不明确”

WHY这发生了吗?

回答

5
my doubt is if null is passed to nh() then how "string" is displayed in output 

重载的方法从类的底层到顶层进行匹配。 Object班坐在顶层,所以最后会匹配。话虽如此,null第一次匹配String参数方法和一个字符串可以为空,所以这个方法被调用。

如果您还添加下面的方法

public static void jh(Integer s) 

到您的代码,然后调用jh(null)介绍IntegerString既是之间的模糊性可以null

精益更多在这里:Java Language Specification: Choosing the Most Specific Method

0

的Java始终用最具体的方法。在你的第一个例子中,它将打印“String”而不是“Object”,因为String比Object更具体。

在第二个例子中,如果null对整数或字符串更好,java将无法选择。您应该施放您的电话或使用原语来消除您的模糊性。

这会工作:

public static void jh(int s) 
{ 
    System.out.print("Integer"); 
} 

而且这会工作:

jh((String) null); 
1

Integer和String都支持空,所以它在编译时产生歧义错误, 现在,如果你使用int而不是Integer,那么它将工作,因为int不支持null。

public class testJava { 
    public static void main(String[] args) 
    { 
     jh(null); 
    } 
    public static void jh(String s) 
    { 
     System.out.print("String"); 
    } 
    public static void jh(Object o) 
    { 
     System.out.print("Object"); 
    } 
    public static void jh(int o) 
    { 
     System.out.print("Object int"); 
    } 
} 
+0

所以,如果从整数改变为int将它称之为字符串的方法???? – 2014-09-06 05:48:11

+0

是的,它会。通过执行上面的例子来检查它。 – bharatpatel 2014-09-06 06:24:18