java如何从内部内部类实现对封闭类的访问?

时间:2013-03-18 16:51:08

标签: java

我在内部类中创建了一个内部类:

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

4 个答案:

答案 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,您仍然可以访问班级的私人成员。

相关问题