该
Derived
对象 已 被创建-它只是在构造函数尚未运行。对象的类型在创建后即刻就不会在Java中更改,这发生在所有构造函数运行之前。var
在运行构造函数之前,在创建对象的过程中,将默认值指定为0。基本上,类型引用被设置,表示对象的其余内存被擦除为零(从概念上讲,无论如何,作为垃圾回收的一部分,它可能已经被擦除为零)。这种行为至少会导致一致性,但可能会很痛苦。在一致性方面,假设您有一个可变基类的只读子类。基类可能具有
isMutable()
有效地默认为true 的属性-但子类覆盖了它,始终返回false。在子类构造函数运行之前,对象是可变的,但是之后是不可变的,这是很奇怪的。另一方面,当您在某个类的构造函数运行之前最终在一个类中运行代码的情况下,这 绝对是 很奇怪的:(
一些准则:
尽量不要在构造函数中做很多工作。避免这种情况的一种方法是在静态方法中进行工作,然后使静态方法的最后一部分成为仅设置字段的构造函数调用。当然,这意味着您在进行工作时不会获得多态的好处-但是在构造函数调用中这样做还是很危险的。
尽量避免在构造函数期间调用非最终方法-这很可能引起混乱。记录所有方法调用你真的 必须 做出 非常 清楚,让任何人都重写他们知道,初始化完成之前,他们将被调用。
如果必须在构造期间调用方法,则 通常 不适合事后再调用它。如果是这种情况,请记录下来并尝试在名称中指出。
首先,尽量不要过度使用继承-仅当您有一个继承自Object以外的超类的子类时,这才成为问题:)继承的设计很棘手。



