Java 为什么内部类的$0字段不是私有的?
Java内部类将对外部实例的引用存储在合成字段中:Java 为什么内部类的$0字段不是私有的?,java,Java,Java内部类将对外部实例的引用存储在合成字段中: class A { class B {} } java.util.Arrays.toString(A.B.class.getDeclaredFields()) // [final A A$B.this$0] 我想知道的是为什么这个字段不作为私有字段生成 程序员在没有反射的情况下无法访问它(在B之外,其中A.此指的是它) 显而易见的猜测是,你可以在A(在B之外)中编写需要访问它的东西,但我想不出任何这样的情况。我的想法是错误的。需要访
class A {
class B {}
}
java.util.Arrays.toString(A.B.class.getDeclaredFields())
// [final A A$B.this$0]
我想知道的是为什么这个字段不作为私有字段生成
程序员在没有反射的情况下无法访问它(在B
之外,其中A.此
指的是它)
显而易见的猜测是,你可以在
A
(在B
之外)中编写需要访问它的东西,但我想不出任何这样的情况。我的想法是错误的。需要访问B的不是A
。这$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。必须将C
中的作为this$1.this$0
访问。或者,它可以有两个字段
final A$B this$1;
final A this$0;
在这种情况下,构造函数将包含this$0=b.this$0代码>(这实际上是我在检查之前所期望的)。您应该看到我将要说的“以便在创建时外部类可以设置此字段”,但这当然也适用于私有字段…@Novy您能解释为什么吗?在那里我没有看到任何我不知道的东西。@Alexey Romanov在我看来,原因是在java中,默认情况下字段、方法和类是包私有的,这意味着它们不能从包外部访问。A$B.this$0是生成的。generated类是A$B,作为生成的字段,它遵循默认值。A$B.this$0是对外部this(A.this)的引用。因此,如果你在A(B之外),你已经可以访问A.this。我不知道这是否是你想要的我相信我已经找到了答案。