小编典典

Java内部类可见性难题

java

考虑以下情况:

public class A {
  public A() { b = new B(); }
  B b;
  private class B { }
}

从Eclipse中的警告中,我引用:Java编译器通过合成访问器方法模拟构造函数AB()。我想编译器现在可以继续进行,并为B创建一个额外的“水下”构造函数。

我觉得这很奇怪:为什么类B在A的ako字段中不可见?并且:这是否意味着B类在运行时不再是私有的?并且:为什么B类的protected关键字表现不同?

public class A {
  public A() { b = new B(); }
  B b;
  protected class B { }
}

阅读 242

收藏
2020-11-16

共1个答案

小编典典

内部类本质上是Java
1.1中引入的一种hack。JVM实际上没有任何内部类的概念,因此编译器必须将其绑定。编译器在类A的“外部”生成类B,但在同一包中,然后向其添加综合访问器/构造函数,以允许A对其进行访问。

当给B一个受保护的构造函数时,A可以访问该构造函数,因为它在同一包中,而无需添加合成构造函数。

2020-11-16