Java内部类将对外部实例的引用存储在一个合成字段中
class A {
class B {}
}
java.util.Arrays.toString(A.B.class.getDeclaredFields())
// [final A A$B.this$0]
我想知道的是为什么没有将此字段生成为私有字段。
程序员不能无反思地访问它(在B
之外,其中A.this
是它的引用)。
一个明显的猜测是,您可以在A
(在B
之外)中写一些需要访问它的东西,但是我想不到任何这种情况。
答案 0 :(得分:0)
我在想错方向。不需要A
来访问B.this$0
,而是访问B
本身的潜在内部类!
如果有
class A {
class B {
class C {}
}
}
在C
之后,变成
class A$B$C {
final A$B this$1;
A$B$C(A$B b) {
this$1 = b;
}
}
A.this
中的和C
必须以this$1.this$0
的身份访问。或者,它可以有两个字段
final A$B this$1;
final A this$0;
在这种情况下,构造函数将包含this$0 = b.this$0;
(这实际上是我在检查之前所期望的)。