1

假设我有一Outer堂课。可以说有一个非静态成员类Inner。因此,如果类声明了一个类型的字段,并且这是根据定义,Outer实例将具有对实例的引用。但是 Inner 实例如何也有隐式引用呢?这个协会是什么时候创建的?InnerOuterInnerOuter

4

3 回答 3

2

来自Java 语言规范

类 O 的直接内部类 C 的实例 i 与 O 的实例相关联,称为 i 的直接封闭实例。对象的直接封闭实例(如果有)在创建对象时确定(第 15.9.2 节)。

于 2013-02-08T17:16:22.597 回答
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 回答
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());
    }
}

编译器自动发出代码来执行第二个中发生的事情:隐式引用的字段(this$0保存 的值)并转换所有构造函数并调用它们以添加该字段的初始化。Outer.thisInner

于 2013-02-08T17:22:21.490 回答