考虑以下情况:
public class A {
public A() { b = new B(); }
B b;
private class B { }
}
我引用 Eclipse 中的警告:java 编译器通过合成访问器方法模拟构造函数 A.B()。我想编译器现在会继续为 B 创建一个额外的“水下”构造函数。
我觉得这很奇怪:为什么 B 类作为 a.k.o 不可见? A 中的字段? 并且:这是否意味着 B 类在运行时不再是私有(private)的? 并且:为什么 B 类的 protected 关键字表现不同?
public class A {
public A() { b = new B(); }
B b;
protected class B { }
}
最佳答案
内部类本质上是 Java 1.1 中引入的 hack。 JVM 实际上没有任何内部类的概念,因此编译器不得不避开它。编译器在类 A 的“外部”生成类 B,但在同一个包中,然后向其添加合成访问器/构造函数以允许 A 访问它。
当您为 B 提供 protected 构造函数时,A 可以访问该构造函数,因为它位于同一个包中,而无需添加合成构造函数。
关于Java 内部类可见性难题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1086255/