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
}
}
}
}
JLS 所说的是:
设C为ClassName表示的类。设n是这样的整数 C是该类的第二个词汇封闭类 合格的这个表达式出现了。
[...]
如果当前类不是内部类,则是编译时错误 C或C本身。
在C:=Main
的情况下,内部类S := {SuperInner, MegaInner, Inner}
的集合。这意味着上面的代码应该可以正常工作。怎么了?
答案 0 :(得分:1)
可以有SuperInner
以及Inner
或MegaInner
的多个实例。
从Main.SupperInner.this.a
内拨打MegaInner
,不清楚哪个实例(如果有实例的话)应将a
变量设置为6。
内部类的行为与普通类很相似:一个类总是需要一个实例来设置变量。 Main.SuperInner.this
并未表示来自MegaInner
视图的实例,因为this
仅指MegaInner
的类层次结构,SuperInner
是{{1}}不属于。
答案 1 :(得分:1)
"符合条件"表达式Main.SuperInner.this.a
在MegaInner
内出现。
MegaInner
的封闭类是Inner
和Main
。因此this
是第0个合格this
,Inner.this
是第1个合格的,Main.this
是第2个合格的。
您缺少的部分是它必须是类的封闭类,其中出现this
的表达式。 SuperInner
不是MegaInner
的附上类,因此Qualified this
不适用于此。
在现实中考虑一下。 this
表达式引用该类的实例。它不是指类本身。例如,您无法从静态方法引用this
。
现在,当您创建MegaInner
的实例时,它必须是Inner
的实际实例和Main
的实际实例的一部分。但是不能保证存在SuperInner
的实际实例。封闭类的代码可以随时创建SuperInner
类型的对象,而与Inner
的实例无关。
因此,您无法在编译时访问this
它。但是如果通过引用变量给出了它的实例,则允许您访问变量a
,因为它们都是同一外部类的成员。