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值也适用于对象..
答案 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。
我希望这会有所帮助。