考虑以下情况:
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 { } }
内部类本质上是Java 1.1中引入的一种hack。JVM实际上没有任何内部类的概念,因此编译器必须将其绑定。编译器在类A的“外部”生成类B,但在同一包中,然后向其添加综合访问器/构造函数,以允许A对其进行访问。
当给B一个受保护的构造函数时,A可以访问该构造函数,因为它在同一包中,而无需添加合成构造函数。