0

Bクラスを拡張し、親コンストラクターで呼び出されるメソッドcreateBody()をオーバーライドするクラスAがあります。

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のままになることです。私は何が間違っているのですか?

4

2 に答える 2

3

ここであなたが危険な海にいることを警告します。createBody作業を進めていくと、スーパークラスコンストラクターを呼び出したいと思うかもしれませんが、サブクラスに実装してください。このようにして、サブクラスの初期化が開始される前に、制御をサブクラスメソッドに転送します。たとえば、その時点で、

private final String x = "string";

はまだ実行されておらず、xはnullです。これは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 に答える