Java 内部类可见性难题

标签 java inner-classes

考虑以下情况:

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/

相关文章:

Java 文件不使用 crontab 运行

java - 从二进制数据中提取某些位

c++ - 如何在 C++ 中自定义嵌套类的方法

scala - 如何从Scala中的内部类引用外部对象

android - 从错误的线程+内部类调用..奇怪的行为

java - 使用对象创建模拟列表

java - Vaadin 当前显示的对象序列化时出现 NotSerializedException

java.lang.NullPointerException-- -"com.google.common.base.Preconditions.checkNotNull(Preconditions.java:770)"

java - 覆盖方法,为什么我不能引用新的自己的方法?

java - 错误 : field name cannot be declared static