1

Outerクラスがあるとしましょう。非静的メンバー クラスがあるとしInnerます。したがって、クラスがタイプのフィールドを宣言し、それが定義によるものである場合Outer、インスタンスはインスタンスへの参照を持ちます。しかし、どのようにして Inner インスタンスも への暗黙的な参照を持っているのでしょうか? この協会はいつ設立されましたか?InnerOuterInnerOuter

4

3 に答える 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 に答える