下面是具有3个重载构造函数的java类:
public class Test {
public Test(Object i){
System.out.println("Object invoked");
}
public Test(String i){
System.out.println("String invoked");
}
public Test(int k){
System.out.println("Integer invoked");
}
public static void main(String[] args) throws Exception {
Test t = new Test(null);
}
}
如果在创建类的新实例时传递了null值,将调用哪个构造函数?是什么原因 ?
最佳答案
Java总是选择最适合您传递的参数的方法(或构造函数)。在这种情况下,这就是String
构造函数-String
是Object
的子类。
想想如果你有什么会发生
new Test("some string")
Object
和String
构造函数都将在此处适用。毕竟,参数既是Object
又是String
。但是,很明显,将调用String
构造函数,因为它比Object
构造函数更具体,并且在给定参数的情况下仍然适用。null
没什么不同;这两个构造函数仍然适用,并且出于相同的原因,仍然选择String
构造函数而不是Object
构造函数。现在,如果存在两个同样“特定”的构造函数(例如,如果您有
Integer
构造函数),则在调用Test(null)
时会出现编译错误。这在JLS §15.12.2中有更详细的概述:
JLS §15.12.2.5概述了确定哪种方法最具体的显式过程。
关于java - 在具有重载构造函数的类中传递null时,首先调用哪个构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18803056/