//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();


}
}

解决方案 »

  1.   

    内部类使用的变量是编译器自己定义的一个同类型变量,并赋值的。
    强制为final是为了防止内部类对该变量的改动。
      

  2.   

    public void method()
    {
        int a = 0;
       class A
        {
             //会在这个作用域接收外部类的成员,类似下面的
             int a;
             public A(int a)
             {
               this.a = a;  
    //如果在内部类中改变这个this.a 外部类的值不会改变 导致外部类和内部类的两个变量不匹配
              }     }
    }
      

  3.   

    上面说的修改this.a的意思就是在内部类中修改局部变量,为了避免出现这种不匹配所以就不让编译通过
      

  4.   

    http://developer.51cto.com/art/200906/128214.htm
    在学习中
      

  5.   

    这一道题有这样的解释,
     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; 
                }
    想想这样将出现什么后果