假设我有一Outer
堂课。可以说有一个非静态成员类Inner
。因此,如果类声明了一个类型的字段,并且这是根据定义,Outer
实例将具有对实例的引用。但是 Inner 实例如何也有隐式引用呢?这个协会是什么时候创建的?Inner
Outer
Inner
Outer
问问题
3351 次
3 回答
2
类 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.this
Inner
于 2013-02-08T17:22:21.490 回答