假设我有一个Outer
类。可以说有一个非静态成员类Inner
。因此,如果Outer
类声明类型为Inner
的字段并且按照定义,则Outer
实例将引用Inner
的实例。但是Inner实例如何也有一个隐含参考Outer
?这个关联何时创建?隐式引用Java中的封闭类
回答
一类的O的直接内类C的我一个实例为O的一个实例,被称为 立即封闭实例1相关的 。对象的立即封闭实例(如果有的话)是 ,在创建对象时(第15.9.2节)确定。
代码
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
的所有构造函数,并调用它们以添加此字段的初始化。
但是,您实际上无法编译第二个示例吗? – Alex 2013-02-08 17:27:18
@Alex有一堆错误,我从内存中写入它。现在应该没问题。 – millimoose 2013-02-08 17:30:26
对,我改变了第二个示例以匹配反编译器告诉我的确实发生的事情。 – millimoose 2013-02-08 17:35:37
你有它周围的其他方法:
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() {}
}
- 1. 如何从Java中的匿名内部类获取对封闭类的引用?
- 2. PHP,封闭类
- 3. 引用封闭类型的类型参数
- 4. 封闭类的C#类型
- 5. 用宏隐藏封闭样板?
- 6. 不是封闭类
- 7. 封闭类vs申报类
- 8. 嵌套类型不能隐藏封闭类型
- 9. java中的未封闭字符文字
- 10. Java lambda表达式有没有方法可以引用封闭对象?
- 11. 正则表达式的封闭式“”(2个单引号)
- 12. 封闭实例无效时的封闭类型行为
- 13. C#中的封闭式检测.net
- 14. 如何引用where关闭中的隐式参数
- 15. Android - 不是封闭类
- 16. 错误:不是封闭类
- 17. 未封闭字符类
- 18. 访问封闭“与”语句隐
- 19. 可变封闭式功能
- 20. 无法调用封装中封装的封闭?
- 21. 存储引用该对象中的对象的盒装封闭
- 22. java.util.regex.PatternSyntaxException:索引44附近的未封闭字符类
- 23. 靠近索引号525的未封闭字符类
- 24. 获取对Rebol中封闭列表/块的引用
- 25. 访问来自封闭成员类(Java)的阴影字段
- 26. 如何在YAML/Swagger.io中递归地引用封闭类型定义?
- 27. 开放形式和封闭形式
- 28. 应用CSS来封闭DIV,而不是封闭的DIV
- 29. 熊猫read_csv摆脱封闭双引号
- 30. 封闭的项目隐藏在pydev包explorer中
“因此,一个外部实例始终具有内在的实例的引用,这是由定义。” - 这不是真的。 – millimoose 2013-02-08 17:14:32
@millimoose为什么不是真的? – Geek 2013-02-08 17:15:31
如果外部类为其明确声明了一个字段,那么外部类的实例将仅保存对内部类实例的引用。 – Alex 2013-02-08 17:18:50