为什么调用带有String Parameter的方法而不是带Object对象的方法

时间:2017-06-24 07:09:12

标签: java overloading

class Jaguar 
{
void method(Object o)
{
    System.out.println("Object Called");
}
void method(String s)
{
    System.out.println("String Called");
}
public static void main(String[] args) 
{
    Jaguar j=new Jaguar();
    j.method(null);
}
}

问题:代码的o / p是String Called而不是ObjectCalled ..为什么? null值也适用于对象..

1 个答案:

答案 0 :(得分:1)

Java总是会尝试使用可用方法的最具体适用版本,请参阅:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5

Object和String都可以将null作为有效值。因此,所有3个版本都适用,因此Java必须找到最具体的版本。

由于Object是String的超类型,因此String版本比Object-version更具体。因此,如果只存在这两种方法,则将选择String版本。

当使用null参数调用时,这三种方法中的每一对都是不明确的。因为每个参数类型都是引用类型。

以下是用null调用你的一个特定方法的三种方法。

doSomething( (Object) null);
doSomething( (String) null);
  

如果再添加一个带有对象子类示例Integer的方法,则编译器将抛出模糊方法错误,因为编译器无法确定哪个方法可以称为字符串1或整数1。

我希望这会有所帮助。