You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:22:40