2013-03-18 46 views
6

我曾在一个内部类中创建一个内部类: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

+0

随着*“这怎么实现代码?” *,你的意思是如何的Java内部实现内部类? – m0skit0 2013-03-18 16:54:10

+0

我认为他的确如此。 – ITroubs 2013-03-18 16:54:42

+0

看到这个http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class – ITroubs 2013-03-18 16:57:04

回答

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实际回答问题的唯一答案。 – m0skit0 2013-03-18 16:59:37

+0

@ m0skit0是的。也许他是唯一懂我英语的人。 – gontard 2013-03-18 17:01:39

+0

不幸的是,我只能一劳永逸......:D – 2013-03-18 17:02:13

1

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

1

除非你做一个内部类静态的,那么是的,它确实有它内部存在的实例的引用,并可以参考它的成员(含民办),同样也适用于内部内部类,里面的内内部类和等等。

+2

我认为问题的关键是**如何在内部完成此操作。 – m0skit0 2013-03-18 16:57:33

0

公共和私人是一个指针的问题,这是一个编译器的问题。

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

注意,指针都无关的问题。
使用reflection您仍然可以访问班级的私人成员。

+0

我认为他的意思是相反的:InnerClass如何访问'EnclosingClass'。 – m0skit0 2013-03-18 16:56:33

+0

@ m0skit0,是的,因为innerinner是内部的一部分,它可以访问它的任何东西,这是有道理的。 – Johan 2013-03-18 17:04:04