jf前面加上final就不报错了

解决方案 »

  1.   

    http://blog.csdn.net/msyqmsyq/article/details/51508356
      

  2.   

    内部类 使用外部类 需要使用final 修饰。因为 有时候 内部类的作用域比外部变量的作用域大。  防止 变量改变  
    所以需要使用final 修饰
      

  3.   

    static final 表示常量,不能修改了
      

  4.   

    这是为了防止以下情况的发生:当你调用完这个方法的时候,这个方法中的内部类的引用被传出来了,然后你用这个引用去调用方法,执行方法的时候发现里边有一开始那个方法中定义的变量,但是那个方法在方法执行完的时候就已经消失,包括里面的变量。
    因此虚拟机就让这个传入的变量从一开始就被存入一个不会消失的地方--即常量池。
    你用的应该是jdk1.8之前的版本(传入的变量不是常量就编译报错),jdk1.8中你不把它定义成final也没事,只是在你去改变这个值的时候会给你报错,所以在内部类中也必须是常量,只不过变得智能了,你不在内部类中用他它就是正常的变量,你在内部类中用它,他就变成了常量,但是你定义了它并且去改变它,那编译器就会认为它是变量,然后你把它放在内部类中,他就会认为你代码写得有问题给你报错。他的运行机制可能被改成:内部类外的变量在传入的时候会定义一个常量去存储它,你使用的实际上是虚拟机定义的常量。而jdk1.8之前的机制是:从一开始就让它是常量,把它存到常量池中。
      

  5.   

    这个是JAVA的闭包实现的Capturing values问题,加上就好了
      

  6.   

    由java 8 开始只要这个变量在作用上相当于常量,就可以不加final 关键词了