//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();
}
}
强制为final是为了防止内部类对该变量的改动。
{
int a = 0;
class A
{
//会在这个作用域接收外部类的成员,类似下面的
int a;
public A(int a)
{
this.a = a;
//如果在内部类中改变这个this.a 外部类的值不会改变 导致外部类和内部类的两个变量不匹配
} }
}
在学习中
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 ++;
} void sI(){
m = 20;
}
想想这样将出现什么后果