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

时间:2012-11-05 20:01:45

标签: 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
       //assign attribute x
    }
}


public class B {

    public B(int parameter) {
        //do some stuff
        createBody();
    }

    abstract public void createBody();
}

如您所见,方法 createBody()修改了 x 属性。我的问题是,一旦超类构造函数完成(当我创建子类的实例时), x 属性仍然是 null 。我做错了什么?

2 个答案:

答案 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