Java中传递null为何会调用带参构造方法?
为什么传入null会调用带参构造方法而非无参构造?
示例代码
Domain类
public class Domain<V> { public Domain(V v) {} // (1) 带参构造 public Domain() {} // (2) 无参构造 }
User类
public class User {}
客户端代码
public class App { public static void main( String[] args ) { Domain<User> d1 = new Domain<>(new User()); Domain<User> d2 = new Domain<>(null); } }
问题
在实例化d2时传入null,实际调用的是带参构造方法(1)而非无参构造(2),这背后的原因是什么?为何null会被视为一个参数?
解答
- 调用语法的本质区别:Java里,无参构造的调用形式是
new Domain<>()——括号内没有任何内容。而new Domain<>(null)的括号里明确存在一个元素,不管这个元素是null还是具体对象,都会被编译器认定为带参数的调用,优先匹配对应参数数量的构造方法。 - null的类型兼容性:
null是所有引用类型的合法取值,对于Domain<User>来说,带参构造的参数类型是User,null可以隐式适配为User类型,完全符合该构造方法的参数要求,因此能成功匹配。 - 构造方法的匹配逻辑:Java在解析构造调用时,会先按参数数量筛选候选方法。
new Domain<>(null)传入了1个参数,无参构造需要0个参数,直接被排除;带参构造正好需要1个参数,且参数类型兼容,因此会被选中执行。
内容的提问来源于stack exchange,提问作者TMOTTM
相关产品推荐
相关产品推荐

