Outer
クラスがあるとしましょう。非静的メンバー クラスがあるとしInner
ます。したがって、クラスがタイプのフィールドを宣言し、それが定義によるものである場合Outer
、インスタンスはインスタンスへの参照を持ちます。しかし、どのようにして Inner インスタンスも への暗黙的な参照を持っているのでしょうか? この協会はいつ設立されましたか?Inner
Outer
Inner
Outer
質問する
3351 次
3 に答える
2
あなたはそれを逆に持っています:
public class Outer {
void foo() {
// In this Outer method, we have no implicit instance of Inner.
innerbar(); // Compiler error: The method bar() is undefined for the type Outer
Inner.this.innerbar();// Compiler error: No enclosing instance of the type Outer.Inner is accessible in scope
// instead, one has to create explicitly instance of Inner:
Inner inner1 = new Inner();
Inner inner2 = new Inner();
inner1.innerbar(); // fine!
}
class Inner {
void innerbar() {};
void callOuter () {
// But Inner has an implicit reference to Outer.
callMe();
// it works also through Outer.this
Outer.this.callMe();
}
}
void callMe() {}
}
于 2013-02-08T17:22:35.803 に答える
2
Java言語仕様から
クラス O の直接内部クラス C のインスタンス i は、i のすぐ外側のインスタンスとして知られる O のインスタンスに関連付けられます。オブジェクトのすぐ外側のインスタンスが存在する場合は、オブジェクトの作成時に決定されます (§15.9.2)。
于 2013-02-08T17:16:22.597 に答える
0
コード
class Outer {
class Inner {
void printOuterThis() {
System.out.println(Outer.this);
}
}
}
Outer.Inner oi = new Outer().new Inner();
これとほとんど同じです:
class Outer {
static class Inner {
Outer outerThis;
public Inner(Outer outerThis) {
this.outerThis = outerThis;
}
void printOuterThis() {
System.out.println(outerThis);
}
}
}
public class Scratch {
public static void main(String[] args) {
Outer.Inner oi = new Outer.Inner(new Outer());
}
}
コンパイラは、2 番目に発生することを行うコードを自動的に出力します。フィールド (this$0
の値を保持するOuter.this
) は暗黙的な参照用でありInner
、このフィールドの初期化を追加するために、 のすべてのコンストラクターと呼び出しを変換します。
于 2013-02-08T17:22:21.490 に答える