我在内部类中创建了一个内部类:
public class EnclosingClass {
public class InnerClass {
private EnclosingClass getEnclosing() {
return EnclosingClass.this;
}
public class InnerInnerClass {
private InnerClass getEnclosing() {
return InnerClass.this;
}
private EnclosingClass getEnclosingOfEnclosing() {
return EnclosingClass.this;
}
}
}
}
我很惊讶java允许InnerInnerClass
直接访问EnclosingClass
。这个代码是如何在Java内部实现的?
InnerInnerClass
保留两个指针(一个在InnerClass
上,另一个在EnclosingClass
上)或InnerInnerClass通过EnclosingClass
访问InnerClass
?
答案 0 :(得分:11)
您只需要使用javap反汇编结果类,看看发生了什么:
private EnclosingClass getEnclosingOfEnclosing();
Code:
0: aload_0
1: getfield #1 // Field this$1:LEnclosingClass$InnerClass;
4: getfield #3 // Field EnclosingClass$InnerClass.this$0:LEnclosingClass;
7: areturn
首先它获取直接封闭类的实例,然后从中获取“顶级”封闭类。
答案 1 :(得分:1)
如果内部类不是“静态”,它们在内部包含对它们所在的类的引用。
答案 2 :(得分:1)
除非你使内部类是静态的,否则它确实引用了它所存在的实例,并且可以引用它的成员(包括private),内部内部类,内部内部内部类也是如此。上。
答案 3 :(得分:0)
public和private是指针问题,这是一个编译器问题。
问题是编译器强制执行类/变量/方法的范围之一。
由于私有方法getEnclosing()
属于InnerClass
的范围,因此可以在整个类中访问它。
请注意,指针与问题无关 使用reflection,您仍然可以访问班级的私人成员。