为什么编译器并不总是插入no-args构造函数?

时间:2014-08-05 13:43:54

标签: java constructor

如果程序员没有提供构造函数,java编译器会自动插入一个no-args构造函数。但是,如果存在争论的构造函数,则编译器不会插入no-args构造函数。

我的问题是为什么?编译器是否有必要将no-args构造函数(如果它不存在)插入到非最终的每个类中?

2 个答案:

答案 0 :(得分:3)

默认构造函数仅在调用时才有意义导致类的可用状态。

如果字段的默认值不会导致可用状态(必填字段的空值),那么您并不希望任何人以这种特定方式创建它。

例如,如果您有一个类,它在其构造函数中接受数据库连接,并将其存储在一个成员中,然后由您的类中的多个方法使用。默认构造函数会将成员设置为null,所有方法都会失败。

但是,如果使用默认值启动类是安全的,则始终可以添加无参数构造函数。我认为这是重点:如果你认为没有args构造函数是一个好主意,你必须在另一个构造函数存在时明确说明。因为调用"默认构造函数"。

并不总是安全的

否则,如果您不想在设计中使用默认构造函数,则无法阻止java创建默认构造函数。

答案 1 :(得分:1)

因为根据语言规范,如果你提供任何构造函数,那么将不会提供默认的no-args构造函数。

如果愿意,自动添加public no-args构造函数是一种方便。

通过指定任何其他构造函数,您实际上是“控制”并对编译器说“嘿,请不要添加no-args构造函数...如果我想要一个,我会自己添加它。” / p>

这是因为在某些情况下你想要一个公共的无参数构造函数(例如,通过工厂类强制对象实例化)。