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是该类的第n个词法包围类
  限定此表达式出现。
  
  [...]
  
  如果当前类不是内部类,则是编译时错误
  属于C类或C类本身。


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

最佳答案

一个可能具有SuperInner以及InnerMegaInner的多个实例。
Main.SupperInner.this.a内部调用MegaInner并不清楚哪个实例(如果有实例)应该将a变量设置为6。

内部类的行为与普通类非常相似:人们总是需要一个实例来在其中设置变量。 Main.SuperInner.this并不表示MegaInner的实例,因为this仅指MegaInner的类层次结构,而SuperInner不属于该类。

09-26 21:23