方法内部类对象不能使用该内部类所在方法的非final局部变量。
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
下面是完整的例子:
class Outer {
public void doSomething(){
final int a =10;
class Inner{
public void seeOuter(){
System.out.println(a);
}
}
Inner in = new Inner();
in.seeOuter();
}
public static void main(String[] args) {
Outer out = new Outer();
out.doSomething();
}
}
Neverbelazy 发表于 2013-4-23 21:21
我明白了你描述的意思:
可是问题是 final int a=10的生命周期到底是多少,它的周期比所在局部长吗?如果 ...
final修饰的变量是常量, 不是存在堆栈中, 就是将一个固定的值给了内部类
public class Test {
public static void main(String[] args) {
method();
}
/*
1. int a=10; 如此定义局部变量时,编译无法通过,提示必须使用final修饰
2. 作用域问題,局部变量作用方法只在方法里,也就是方法的"{}"之间有用
3. 定义成final可以,是因为a就变成了常量,常量当然哪里都能用,例如:int a =10,10就是常量
*/
public static void method(){
final int a=10;
class Inner{
void fun(){
System.out.println(a);
}
}
new Inner().fun();
}
}