为什么构造函数调用在以下示例中不明确?

时间:2014-04-27 17:17:40

标签: java constructor

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的构造函数?这种歧义如何解决?

3 个答案:

答案 0 :(得分:3)

  

//打印String。为什么不反对?

因为编译器选择最具体的类型。

  

如果我添加另一个带有Integer类型的参数的构造函数,或者for   任何其他类型的问题,调用新的Test(null);结果是   编译错误 - 构造函数Test(Object)不明确。

现在StringInteger在对象层次结构中处于同一级别,因此,编译器无法从这两个中选择一个

答案 1 :(得分:2)

因为它是由最具体的参数类型决定的。

由于String是Object的子类,而null是任何东西的子类型,因此调用第二个构造函数,因为String比Object更具体。

答案 2 :(得分:0)

编译器旨在获取与参数中发送的值非常匹配的重载方法。