当前位置: 代码迷 >> J2SE >> 为啥小弟我的局部内部类可以访问非final的局部变量
  详细解决方案

为啥小弟我的局部内部类可以访问非final的局部变量

热度:119   发布时间:2016-04-23 20:22:26.0
为啥我的局部内部类可以访问非final的局部变量?
今天看书的时候看到了局部内部类,书上说局部内部类可以访问局部变量,但是必须是final的。因为局部变量在方法调用之后就消失了,使用final声明的话该局部变量会存入堆中,和内部类有一样的声明周期。但是我写了一个局部内部类,竟然可以访问非final的局部变量,请问这是什么回事呢。ps:我的jdk是8 难道和这个有关系?

public class jubuneibulei {
public void p(int a, int b){

class te{
void print(){
System.out.println(a);
}
}
new te().print();
}
public static void main(String[] args) {
 new jubuneibulei().p(111, 222);

}
}


------解决方案--------------------
嗯,可能是吧,jdk8的确多了一些东西,比如接口可以含有方法体等等——http://www.oschina.net/translate/far-sight-look-at-jdk8

jdk7还是不允许的,jdk在不断变化啊
------解决方案--------------------
我的jdk1.7。刚试了一下,确实会出现Cannot refer to a non-final variable a inside an inner class defined in a different method错误。估计就是jdk问题,现在用jdk1.8的估计不多吧
------解决方案--------------------
跟着这个问题,简单看了一下 jdk8 新特性
------解决方案--------------------
jdk版本的问题啦,我jdk8以下版本必须得设置final,不然报错。oracle又马上要推出java9了,叫我等还停留在java6上的人情何以堪啊!
------解决方案--------------------
Java 8的新特性,但其实只是让你方便一点,在你这个内部类里效果等同于final
比如,如果你想修改a或b
a = 100
那么会告诉你:
Local variable a defined in an enclosing scope must be final or effectively final
注意后面说的effectively final,就是说表面上没有final修饰,但实际上必须和final有相同的效果
  相关解决方案