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}。这意味着上面的代码应该可以正常工作。怎么了?
发布于 2014-11-15 08:26:06
可以有多个SuperInner实例,以及Inner或MegaInner的实例。从Main.SupperInner.this.a内部调用MegaInner时,不清楚哪个实例(如果有实例的话)应该将a变量设置为6。
内部类的行为与普通类非常相似:始终需要一个实例来设置它们中的变量。Main.SuperInner.this并不表示MegaInner视图中的实例,因为this仅指MegaInner的类层次结构,而SuperInner并不是该类层次结构的一部分。
发布于 2014-11-15 08:28:35
“限定此”表达式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,因为它们都是同一个外部类的成员。
https://stackoverflow.com/questions/26943958
复制相似问题