Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么内部类的$0字段不是私有的?_Java - Fatal编程技术网

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

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之外)中编写需要访问它的东西,但我想不出任何这样的情况。我的想法是错误的。需要访

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

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。我不知道这是否是你想要的我相信我已经找到了答案。