class Test {
public Test(Object obj) {
System.out.println("Object");
}
public Test(String s) {
System.out.println("String");
}
public static void main(String[] args) {
new Test(null); //prints String. Why not Object?
}
}
如果我添加另一个类型为Integer
的参数的构造函数,或者对于任何其他类型,调用new Test(null);
会导致编译错误 - The constructor Test(Object) is ambiguous
。
为什么上述例子没有产生错误?在执行它时,调用带有参数String
的构造函数。为什么不调用参数类型为Object
的构造函数?这种歧义如何解决?
答案 0 :(得分:3)
//打印String。为什么不反对?
因为编译器选择最具体的类型。
如果我添加另一个带有Integer类型的参数的构造函数,或者for 任何其他类型的问题,调用新的Test(null);结果是 编译错误 - 构造函数Test(Object)不明确。
现在String
和Integer
在对象层次结构中处于同一级别,因此,编译器无法从这两个中选择一个
答案 1 :(得分:2)
因为它是由最具体的参数类型决定的。
由于String是Object的子类,而null是任何东西的子类型,因此调用第二个构造函数,因为String比Object更具体。
答案 2 :(得分:0)
编译器旨在获取与参数中发送的值非常匹配的重载方法。