6

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

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)或 InnerInnerClassEnclosingClass通过InnerClass?

4

4 回答 4

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

因此,它首先获取直接封闭类的实例,然后从中获取“顶级”封闭类。

于 2013-03-18T16:56:30.050 回答
1

如果内部类不是“静态的”,则它们在内部包含对包含它们的类的引用。

于 2013-03-18T16:53:42.013 回答
1

除非您将内部类设为静态,否则是的,它确实具有对其存在的实例的引用,并且可以引用它的成员(包括私有),内部内部类,内部内部内部类等也是如此。

于 2013-03-18T16:54:07.377 回答
0

public 和 private 是一个指针问题,它是一个编译器问题。

问题是执行类/变量/方法范围的编译器之一。因为私有方法getEnclosing()属于 的范围InnerClass,所以可以在整个类中访问它。

请注意,指针与问题无关。
使用反射,您仍然可以访问类的私有成员。

于 2013-03-18T16:55:13.773 回答