0

初期化で囲んでいるクラスへの参照を使用している内部クラス (非静的) があります。内部クラスは今、囲んでいるクラスへの参照を保持しますか?

class Enclosing {
  class Inner {
    private final ABC innerField = outerField.computeSomething();
  }

  private final XYZ outerField = something();
}

アップデート

で外部クラスを参照できることをよく知っていEnclosing.thisます。

しかし、クラスが参照を使用しない場合、コンパイル後に参照が存在する必要がありますか? 参照が初期化でのみ使用されている場合でも必要ですか?

内部クラスが常に外部クラスへの参照を保持しているとはどこに書いてありますか?

4

4 に答える 4

8

ネストされた非静的クラスは、常に外側のクラスへの参照を保持します。あなたの例では、外側のクラスをInnerasから参照できますEnclosing.this

JLS 8.1.3「内部クラスと囲みインスタンス」 :

「クラス O の直接内部クラス C のインスタンス i は、i のすぐ外側のインスタンスとして知られる O のインスタンスに関連付けられています。オブジェクトのすぐ外側のインスタンスがあれば、オブジェクトが作成されるときに決定されます ( §15.9.2)」

于 2012-10-30T19:00:59.973 に答える
1

はい。内部クラス (または非静的なネストされたクラス) は、外部クラスの他のインスタンス メンバーとまったく同じであり、そのため常に外側のクラスの参照が必要です。

于 2012-10-30T21:44:33.863 に答える
0

内部クラスが常に外部クラスへの参照を保持しているとはどこに書いてありますか?

同じ場所で Outer.this 構文を定義します。この構文の存在は参照の存在です。使用しない場合は抑制されることを示唆するものは何もありません。

于 2012-10-30T21:06:22.993 に答える
-1

ネストされたクラスには 2 つのケースがあります。

静的なネストされたクラス。ネストされたクラスは、外部クラスへの参照を保持しません。

非静的ネスト クラス。ネストされたクラスは、外部クラスへの参照を保持します。

外部クラスを拡張する静的なネストされたクラスのケースは、外部クラスを拡張する非静的なネストされたクラスほど興味深いものではありません。

覚えておくべき重要なことは、静的ではないネストされたクラスは単に内部クラスと呼ばれることです。

于 2012-10-30T19:03:30.800 に答える