为什么我们无法从内部的类构造函数访问另一个内部类?

时间:2014-11-15 08:14:28

标签: java class

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
    }

    public class SuperInner{
        int a;
    }

    public class Inner{
        public class MegaInner{
            public MegaInner(){
                Main.SuperInner.this.a = 6; //error: not an enclosing class: Main.SuperInner
            }
        }
    }
}

IDEON

JLS 所说的是:

  

设C为ClassName表示的类。设n是这样的整数   C是该类的第二个词汇封闭类   合格的这个表达式出现了。

     

[...]

     

如果当前类不是内部类,则是编译时错误   C或C本身。

C:=Main的情况下,内部类S := {SuperInner, MegaInner, Inner}的集合。这意味着上面的代码应该可以正常工作。怎么了?

2 个答案:

答案 0 :(得分:1)

可以有SuperInner以及InnerMegaInner的多个实例。 从Main.SupperInner.this.a内拨打MegaInner,不清楚哪个实例(如果有实例的话)应将a变量设置为6。

内部类的行为与普通类很相似:一个类总是需要一个实例来设置变量。 Main.SuperInner.this并未表示来自MegaInner视图的实例,因为this仅指MegaInner的类层次结构,SuperInner是{{1}}不属于。

答案 1 :(得分:1)

"符合条件"表达式Main.SuperInner.this.aMegaInner内出现。

MegaInner的封闭类是InnerMain。因此this是第0个合格thisInner.this是第1个合格的,Main.this是第2个合格的。

您缺少的部分是它必须是类的封闭类,其中出现this的表达式。 SuperInner不是MegaInner的附上类,因此Qualified this不适用于此。

在现实中考虑一下。 this表达式引用该类的实例。它不是指类本身。例如,您无法从静态方法引用this

现在,当您创建MegaInner的实例时,它必须是Inner的实际实例和Main的实际实例的一部分。但是不能保证存在SuperInner的实际实例。封闭类的代码可以随时创建SuperInner类型的对象,而与Inner的实例无关。

因此,您无法在编译时访问this它。但是如果通过引用变量给出了它的实例,则允许您访问变量a,因为它们都是同一外部类的成员。