我们知道只有最终的本地变量才能在匿名类中访问,这里有一个很好的原因: 为什么只有最终变量可以在匿名类中访问?.
然而,我发现如果变量是封闭类的成员字段,则匿名类仍然可以访问非最终变量: 如何从匿名类内部访问封闭类实例变量?
我感到困惑。我们确保只有最终本地变量才能在匿名类中访问,因为我们不希望变量在匿名类和本地函数之间不同步。同样的原因也应该适用于在匿名类中尝试访问非最终封闭类成员的情况。
为什么这不是一个问题呢?
我们知道只有最终的本地变量才能在匿名类中访问,这里有一个很好的原因: 为什么只有最终变量可以在匿名类中访问?.
然而,我发现如果变量是封闭类的成员字段,则匿名类仍然可以访问非最终变量: 如何从匿名类内部访问封闭类实例变量?
我感到困惑。我们确保只有最终本地变量才能在匿名类中访问,因为我们不希望变量在匿名类和本地函数之间不同步。同样的原因也应该适用于在匿名类中尝试访问非最终封闭类成员的情况。
为什么这不是一个问题呢?
final
,以防其值稍后发生更改。class InnerSuper{
void mInner(){}
}
class Outer{
int aOuter=10;
InnerSuper mOuter(){
int aLocal=3999;
class Inner extends InnerSuper{
int aInner=20;
void mInner(){
System.out.println("a Inner : "+aInner);
System.out.println("a local : "+aLocal);
}
}
Inner iob=new Inner();
return iob;
}
}
class Demo{
public static void main(String args[]){
Outer ob=new Outer();
InnerSuper iob=ob.mOuter();
iob.mInner();
}
}
class Outer{
int aOuter=10;
InnerSuper mOuter(){
int aLocal=3999;
class Inner extends InnerSuper{
int aInner=20;
void mInner(){
System.out.println("a Inner : "+aInner);
System.out.println("a local : "+aLocal);
}
}
aLocal=4000;
Inner iob=new Inner();
return iob;
}
}
mOuter
是Outer
类的一个方法,它返回InnerSuper
类的一个实例。该方法在主方法中执行。如果这是您需要澄清的内容。 - Missaka Iddamalgoda实际上,一个本地变量(例如x
)在匿名实例之外的方法调用期间存在。它的对象引用存储在调用堆栈中;x == 包含对象引用的堆栈地址。匿名实例内部的x
是一个副本,因为它的生命周期不同,更长或更短。
由于现在有两个变量,因此决定不允许对x
进行赋值(实现起来很奇怪),并要求该变量为“有效最终变量”。
可以访问外部成员,因为匿名实例是一个包含OuterClass.this引用的内部类。