0

これが私の問題です

class A{
  private B b = new B(this); // line 2

  A(){}
}

これは単なる例です。コードと正常に動作します。thisしかし、私は現在の参照(Aのインスタンス)に使用されていることに疑問を持っています。クラスの初期化は、クラスインスタンスを取得する前に行われます。thisでは、どうすれば2行目に入れることができますか?初期化する前にインスタンス化は発生しますか?

4

5 に答える 5

2

あなたは興味深い点を持ち出します。これは、例を使用するときに発生する可能性のある実行時の問題を示す、考案された教育例です。

class A {
    private boolean isInitialized = false;
    private final B b             = new B(this);
    public A() {
        initialize();
    }
    private void initialize() {
        isInitialized = true;
    }
    public boolean isInitialize() {
        return isInitialized;
    }
    public B getB() {
        return b;
    }
}

class B {
    private boolean isInitialized = false;
    final private A a;
    public B(final A a) {
        this.a = a;
        initialize();
        System.out.println("inB:          a.isInitialize()=" + a.isInitialize());
    }
    private void initialize() {
        isInitialized = true;
    }
    public boolean isInitialize() {
        return isInitialized;
    }
}

public static void main(final String[] args) {
    final A a = new A();
    System.out.println("inMain:       a.isInitialize()=" + a.isInitialize());
    System.out.println("inMain:a.getB().isInitialize()=" + a.getB().isInitialize());
}

出力:

inB:          a.isInitialize()=false
inMain:       a.isInitialize()=true
inMain:a.getB().isInitialize()=true

クラスB内のクラスAに渡された参照を使用すると、完全に初期化されていないオブジェクトを使用するという実際のリスクが発生します。

気をつけて。

于 2013-03-09T17:28:19.810 に答える
1

new ClassA()これはクラスの初期化ではなく(段階的にデバッグしてみてください)、実際にはインスタンスの初期化です。

コンストラクター(from )が、初期化されていないフィールドにアクセスするClassB関数fromを呼び出す場合、いくつかの問題が発生する可能性があります。ClassAClassA

編集:これは、コンストラクターが呼び出される前に行われます。

于 2013-03-09T17:08:26.767 に答える
0

thisクラスAのオブジェクトを作成すると、その存在が表示されます。インスタンス変数はオブジェクトの作成後に割り当てられ、静的変数はクラスが読み込まれるとすぐに、またオブジェクトの作成前に初期化されます。静的ブロックで上記の初期化を使用することはできません

static {
    private B b = new B(this); // compiler error. you cannot use 'this' in static context.
}
于 2013-03-09T17:04:38.550 に答える
0

this正しく使用されています。コンストラクターを呼び出す必要はまったくありません。

于 2013-03-09T17:04:59.457 に答える
0

変更の必要はありません、すべてが大丈夫です。thisAへの有効な参照です。

于 2013-03-09T17:05:08.353 に答える