Java默认提供无参构造,为何仍需手动实现noArgsConstructor?
Java无参构造方法常见疑问解答
一、为什么明明有默认无参构造,还要手动实现?
Java编译器只会给完全没定义任何构造方法的类自动生成默认无参构造。但只要你手动写了任意一个构造方法(比如带参数的),编译器就不会再自动生成无参构造了。这时候如果遇到以下场景,就必须手动加无参构造:
- 像ORM框架(比如JPA)、序列化工具(比如Jackson)这类工具,需要通过反射创建对象,必须依赖无参构造
- 子类继承这个类时,如果子类构造没显式调用父类的有参构造,编译器会默认去调父类无参构造,要是父类没有,直接编译报错
- 业务代码里需要用
new 类名()的方式创建实例,而不是每次都传参数
二、Spring Boot里只写有参构造会报错的原因
Spring Boot很多核心操作都依赖无参构造:
- Bean创建:Spring容器默认用反射调用无参构造来生成Bean实例(比如
@Component、@Service、@Entity标记的类),要是类只有有参构造,Spring找不到无参的,就会抛出实例化失败的异常 - JSON处理:Spring Boot默认用Jackson处理JSON请求和响应,Jackson把JSON转成POJO的时候,默认得用无参构造创建对象,没有的话会直接报映射错误
三、自己创建POJO实例时报错的原因
当你给POJO写了有参构造后,默认的无参构造就被“覆盖”了——编译器不再自动生成它。这时候你再尝试用new POJO()创建实例,编译器会提示找不到这个构造方法,因为它根本不存在了。要么你每次创建都传对应参数调用有参构造,要么手动给POJO加上无参构造才能解决。
内容的提问来源于stack exchange,提问作者Ananthu K Kumar
相关产品推荐
相关产品推荐

