Java code
//DemoClass.java
public class DemoClass{
public static void main(String[] args){
DemoClass dc = new DemoClass();
dc.setI();
System.out.println(dc.i);
}
int i = 10;
void setI(){
final int m = 0; //
class D{
void sI(){
m = 20; //在内部类中访问局部变量m,为啥要m要位final型的呢?
}
}
new D().sI();
}
}
作者: zhanghua 时间: 2011-11-15 16:08
这一道题有这样的解释,
int i = 10;
void setI(){
final int m = 0; //
class D{
void sI(){
m = 20; //在内部类中访问局部变量m,为啥要m要位final型的呢?
}
}
new D().sI();
}
局部变量有作用范围是很小的,只是在花括号里面
不是整个类
说的很对,因为sun公司考虑的很周全,你这种写法,M是不是final对程序没有什么区别,那为什么编译器让你把m变成final呢,因为sun考虑到局部变量有作用范围是很小,假如内部类使用到了线程去访问局部变量,这样当方法结束了,内部类线程并没有结束,而方法结束,局部变量的值将会销毁,这样将导致内部类线程使用到一个没有声明的变量,这样将会会出错。
例如
class D extends Thread{
public void run(){
//try....catch不写了
Thread.sleep(5000);
m ++;
}