为什么在调用超级构造函数或调用重载构造函数时不允许使用实例变量和方法?
答案 0 :(得分:1)
因为当你调用超级构造函数时,就是构建父类。由于类层次结构,在构建父类时尚未构造子类。让我们用一个例子来说明
class Parent() {
protected String s;
public Parent(String s) {
System.out.println("parent created with "+s);
this.s = s; // don't do this at home, kids, one letter variables stinks like hell
}
}
class Child extends Parent {
public Child(String s) {
// don't try to put an instruction here, it's impossible due to the mandatory call to super as first instruction
super(s);
System.out.println("child created with "+s);
}
}
当您致电new Child("I'm the king of the world")
时,调用的第一个方法实际上是Parent(String)
,因为System.out会显示。这很正常,因为Child
是Parent
的子类,必须在Parent
对象之前创建基础Child
对象。
这与实例变量有什么关系?嗯,它们仅在创建对象时存在。因此,在创建Child
对象时,Parent
的实例变量不可用。在以下示例中
class OtherChild extends Parent {
private String prefix = "some ";
public OtherChild(String s) {
// don't try to put an instruction here, it's impossible due to the mandatory call to super as first instruction
super(prefix+s);
System.out.println("child created with "+s);
}
}
您将遇到初始化错误,因为在调用suoper构造函数时未初始化prefix
字段,因为Child对象实际上在此精确时间尚不存在。我的解释是否足够明确?
答案 1 :(得分:0)
因为对象未完全初始化。对象可能处于不一致状态,容易出错且难以发现。可以调用静态方法,因为它们独立于对象状态。
答案 2 :(得分:0)
因为在调用super时,实例变量还不存在!只要有new
语句在堆中创建该类的对象,其构造函数首先会调用super()
- 默认 - 或者您super(..)
- 如果指定了一个 - 并且然后通过初始化对象的字段继续。