如果程序员没有提供构造函数,java编译器会自动插入一个no-args构造函数。但是,如果存在争论的构造函数,则编译器不会插入no-args构造函数。
我的问题是为什么?编译器是否有必要将no-args构造函数(如果它不存在)插入到非最终的每个类中?
答案 0 :(得分:3)
默认构造函数仅在调用时才有意义导致类的可用状态。
如果字段的默认值不会导致可用状态(必填字段的空值),那么您并不希望任何人以这种特定方式创建它。
例如,如果您有一个类,它在其构造函数中接受数据库连接,并将其存储在一个成员中,然后由您的类中的多个方法使用。默认构造函数会将成员设置为null
,所有方法都会失败。
但是,如果使用默认值启动类是安全的,则始终可以添加无参数构造函数。我认为这是重点:如果你认为没有args构造函数是一个好主意,你必须在另一个构造函数存在时明确说明。因为调用"默认构造函数"。
并不总是安全的否则,如果您不想在设计中使用默认构造函数,则无法阻止java创建默认构造函数。
答案 1 :(得分:1)
因为根据语言规范,如果你提供任何构造函数,那么将不会提供默认的no-args构造函数。
如果愿意,自动添加public no-args构造函数是一种方便。
通过指定任何其他构造函数,您实际上是“控制”并对编译器说“嘿,请不要添加no-args构造函数...如果我想要一个,我会自己添加它。” / p>
这是因为在某些情况下你不想要一个公共的无参数构造函数(例如,通过工厂类强制对象实例化)。