我有一个A类,它扩展了B类并覆盖了在父构造函数中调用的方法 createBody():
public class A extends B {
SomeClass x = null
public A(int parameter) {
super(parameter);
//do something with atributte x
}
createBody() {
//do some stuff
//assign attribute x
}
}
public class B {
public B(int parameter) {
//do some stuff
createBody();
}
abstract public void createBody();
}
如您所见,方法 createBody()修改了 x 属性。我的问题是,一旦超类构造函数完成(当我创建子类的实例时), x 属性仍然是 null 。我做错了什么?
答案 0 :(得分:3)
我可以警告你,你在这里处于危险的水域。当你处理它时,你可能会意识到你想在超类构造函数中调用createBody
,但是在子类中实现它。这样,您就可以在子类的初始化开始之前将控制转移到子类方法。例如,此时甚至是
private final String x = "string";
尚未运行且x为null。这是Java的反成语,你应该不惜一切代价避免使用它。
答案 1 :(得分:0)
你的超级班有一个抽象的方法
`abstract public void createBody();`
将超类声明为abstract
,因为超类必须是一个抽象类来定义抽象方法。
其次,您不应该从超类构造函数调用createBody方法 因为它可能正在使用甚至无法初始化的变量。
//do some stuff
//assign attribute x <--- never do such stuffs