Java 如何在超类构造函数中使用子类的属性?
我有一个类a,它扩展了一个B类并重写了在父构造函数中调用的方法createBody():Java 如何在超类构造函数中使用子类的属性?,java,oop,Java,Oop,我有一个类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 /
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。我做错了什么?请允许我警告您,您现在处于危险的境地。在处理它的过程中,您可能会意识到您希望在超类构造函数中调用
createBody
,但在子类中实现它。这样,您就可以在子类的初始化开始之前将控制权转移到该子类方法。例如,在该点上,甚至一条线,如
private final String x = "string";
尚未运行,x为空。这是一个反Java的习惯用法,你应该不惜一切代价避免它。请允许我警告你,你在这里处境危险。在处理它的过程中,您可能会意识到您希望在超类构造函数中调用
createBody
,但在子类中实现它。这样,您就可以在子类的初始化开始之前将控制权转移到该子类方法。例如,在该点上,甚至一条线,如
private final String x = "string";
尚未运行,x为空。这是Java的反习惯用法,您应该不惜一切代价避免它。您的超类有一个抽象方法
`abstract public void createBody();`
将超类声明为抽象
,因为超类必须是一个抽象类才能定义抽象方法
其次,您不应该从超类构造函数调用createBody方法
因为它可能使用了甚至无法初始化的变量
//do some stuff
//assign attribute x <--- never do such stuffs
//做点什么
//赋值属性x你的超类有一个抽象方法
`abstract public void createBody();`
将超类声明为抽象
,因为超类必须是一个抽象类才能定义抽象方法
其次,您不应该从超类构造函数调用createBody方法
因为它可能使用了甚至无法初始化的变量
//do some stuff
//assign attribute x <--- never do such stuffs
//做点什么
//赋值属性x除非B将方法createBody()
声明为具体或抽象方法,否则不会编译该属性。请显示实际的代码。为什么这个方法在子类而不是父类中?@JordanKaye,因为B类被扩展了好几次,每个子类实现了不同的method@JimGarrison谢谢你,吉姆。我会的。因为不清楚,我把你的问题标记为-1。我知道你可能只是混淆了一些术语,(例如,B是超类,而你的超类似乎并没有像你的标题所暗示的那样试图使用x。同样,如果你能解决这个例子,你可能会从发布真正的代码或一个实际的例子中受益,如果你能解决这个例子,你就能解决实际问题。除非B声明methodcreateBody()
作为具体的或抽象的方法。请显示实际的代码。为什么这个方法在子类而不是父类中?@JordanKaye,因为B类被扩展了好几次,每个子类实现了不同的method@JimGarrison谢谢你,吉姆。我会的。因为不清楚,我把你的问题标记为-1。我明白了d表示您可能只是混淆了一些术语,(例如,B是超类,而您的超类似乎没有像标题所示尝试使用x。同样,如果您能够解决示例,您可能会从发布真实代码或实际示例中受益,如果您能够解决实际问题。