0

我有一个类 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属性仍然为空。我究竟做错了什么?

4

2 回答 2

3

我可以警告你,你在这里是危险的水域。在处理它时,您可能会意识到您想createBody超类构造函数中调用,但在子类中实现它。这样,您就可以在子类的初始化开始之前将控制权转移到子类方法。例如,在那一点上,即使是一条线,例如

private final String x = "string";

尚未运行且 x 为空。这是 Java 的反习惯用法,您应该不惜一切代价避免它。

于 2012-11-05T20:08:32.623 回答
0

你的超类有一个抽象方法

`abstract public void createBody();` 

将超类声明为abstract,因为超类必须是抽象类才能定义抽象方法。

其次,您不应该从超类构造函数调用 createBody 方法,因为它可能正在使用甚至无法初始化的变量。

//do some stuff
//assign attribute x  <--- never do such stuffs 
于 2012-11-05T20:24:49.793 回答