为什么内部类的$ 0字段不是私有的?

时间:2019-02-08 08:12:47

标签: java

Java内部类将对外部实例的引用存储在一个合成字段中

class A {
    class B {}
}

java.util.Arrays.toString(A.B.class.getDeclaredFields())
// [final A A$B.this$0]

我想知道的是为什么没有将此字段生成为私有字段。

程序员不能无反思地访问它(在B之外,其中A.this是它的引用)。

一个明显的猜测是,您可以在A(在B之外)中写一些需要访问它的东西,但是我想不到任何这种情况。

1 个答案:

答案 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;(这实际上是我在检查之前所期望的)。