Java语言是否保证在构造函数中应用于instanceof
的getClass()
运算符或this
方法始终适用于层次结构中的较深类?
例如,如果我想限制允许从超类调用构造函数的子类,我可以这样做:
class A {
A() {
final Class<?> clazz = getClass();
if (clazz != A.class && clazz != B.class && clazz != C.class) {
throw new IllegalStateException();
}
}
}
但是我想知道这种语言是否保证它会工作。
是,有保证。
如果未显式指定super()
,则构造函数的第一个动作始终是对其进行隐式调用。 (JLS)
强制执行此约束的原因-不允许在任何时候调用父构造函数-以便确保所有超类均被初始化,无论是Object
还是任何其他超类型。此时,Object
的每个实例方法都可以安全使用; getClass
也不例外。
另请参阅Why do this() and super() have to be the first statement in a constructor?
您的问题本质上是,在哪个对象上称为getClass
?JLS涵盖如下
关键字this只能在以下情况下使用:
- 类的构造函数的主体(第8.8.7节)
- ...
用作主表达式时,关键字this表示一个值,该值是对该对象的引用实例方法或默认方法被调用(第15.12节),或正在构造的对象。