Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在超类构造函数中使用子类的属性?_Java_Oop - Fatal编程技术网

Java 如何在超类构造函数中使用子类的属性?

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 /

我有一个类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。我做错了什么?

请允许我警告您,您现在处于危险的境地。在处理它的过程中,您可能会意识到您希望在超类构造函数中调用
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声明method
createBody()
作为具体的或抽象的方法。请显示实际的代码。为什么这个方法在子类而不是父类中?@JordanKaye,因为B类被扩展了好几次,每个子类实现了不同的method@JimGarrison谢谢你,吉姆。我会的。因为不清楚,我把你的问题标记为-1。我明白了d表示您可能只是混淆了一些术语,(例如,B是超类,而您的超类似乎没有像标题所示尝试使用x。同样,如果您能够解决示例,您可能会从发布真实代码或实际示例中受益,如果您能够解决实际问题。