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
以及Inner
或MegaInner
的多个实例。
从Main.SupperInner.this.a
内部调用MegaInner
并不清楚哪个实例(如果有实例)应该将a
变量设置为6。
内部类的行为与普通类非常相似:人们总是需要一个实例来在其中设置变量。 Main.SuperInner.this
并不表示MegaInner
的实例,因为this
仅指MegaInner
的类层次结构,而SuperInner
不属于该类。