interface A{
public void a();
}public class OutClass{
int xField;
public A getAInstance(){ // Method Start;
final int xLocal = 0;
int yLocal = 1;
xField = 2;
return new A(){
public void a(){
System.out.println(xLocal); //OK
//System.out.println(yLocal); 错误, yLocal不可见
System.out.println(xField); //OK
}
}; //A class defined within a method
//Method End
} public A getA2(final String s){ //the parameters should also be final
return new A(){
public void a(){
System.out.println(s);
}
}
}
}在方法体中(getAInstance)定义的(匿名内部, new A(){......})类的字段可见性在方法体重定义的类只能访问这个程序段中被声明为final的局部变量(xLocal)。这是因为在方法体重定义的变量(局部变量,yLocal)通常是被认为是automatic(自动)的,即他们的生命周期只存在于方法运行的时候(在Method Start,End 之间)。而类中的字段,即使是在方法体中生成的,其生命周期仍可存在该方法体外。
之所以这样,是因为当其他地方的代码调用了getAInstance()便得到了一个新的A对象,其后可能会调用到A里面的a(),如果不将xLocal声明为final,此时因为getAInstance()已经结束,xLocal,yLocal等局部变量已经被释放,无法再被这个由getAInstance得到的A的实例访问,会出错,将其声明为final后,虽然对于getAInstance来说,xLocal已经结束(下一次的getAInstance中的xLocal与这次的将不同)但对于由getAInstance返回的A的实例而言,它仍是可见的。
public void a();
}public class OutClass{
int xField;
public A getAInstance(){ // Method Start;
final int xLocal = 0;
int yLocal = 1;
xField = 2;
return new A(){
public void a(){
System.out.println(xLocal); //OK
//System.out.println(yLocal); 错误, yLocal不可见
System.out.println(xField); //OK
}
}; //A class defined within a method
//Method End
} public A getA2(final String s){ //the parameters should also be final
return new A(){
public void a(){
System.out.println(s);
}
}
}
}在方法体中(getAInstance)定义的(匿名内部, new A(){......})类的字段可见性在方法体重定义的类只能访问这个程序段中被声明为final的局部变量(xLocal)。这是因为在方法体重定义的变量(局部变量,yLocal)通常是被认为是automatic(自动)的,即他们的生命周期只存在于方法运行的时候(在Method Start,End 之间)。而类中的字段,即使是在方法体中生成的,其生命周期仍可存在该方法体外。
之所以这样,是因为当其他地方的代码调用了getAInstance()便得到了一个新的A对象,其后可能会调用到A里面的a(),如果不将xLocal声明为final,此时因为getAInstance()已经结束,xLocal,yLocal等局部变量已经被释放,无法再被这个由getAInstance得到的A的实例访问,会出错,将其声明为final后,虽然对于getAInstance来说,xLocal已经结束(下一次的getAInstance中的xLocal与这次的将不同)但对于由getAInstance返回的A的实例而言,它仍是可见的。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货