Java如何实现从内部内部类访问封闭类?

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),或者InnerInnerClass通过InnerClass访问EnclosingClass


你的意思是询问Java内部是如何实现内部类的,对吗? - m0skit0
我认为他的意思是那样的。 - ITroubs
请参考以下链接:https://dev59.com/GXVD5IYBdhLWcg3wJIIK - ITroubs
@ITroubs实际上与这个问题无关。 - m0skit0
@m0skit0 是的,这是我的问题。如果我的问题难以理解,请随意改进它。 - gontard
1
@m0skit0 实际上已经有了。我只是忘记提到他必须查看jrudolph发布的帖子。他通过展示生成的字节码来解释Java如何处理非静态内部类。 - ITroubs
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

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


@m0skit0 是的。也许他是唯一能理解我的英语的人。 - gontard

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

1

除非你将内部类设为静态,否则它确实会引用它所存在的实例,并且可以引用其成员(包括私有成员),对于内部嵌套类、内部嵌套嵌套类以及更深层次的内部类同样适用。


2
我认为问题是关于这个是如何在内部完成的。 - m0skit0

0

公有和私有是一个指针问题,而不是一个编译器问题。

问题在于编译器强制执行类/变量/方法的作用域。 由于私有方法getEnclosing()位于InnerClass的范围内,因此可以在整个类中访问。

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


我认为他的意思是相反的:InnerClass如何访问EnclosingClass - m0skit0
@m0skit0,是的,因为innerinner是inner的一部分,它可以访问周围的任何内容,这很有道理。 - Johan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接