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

creatorrr 2014-08-21 07:46:29
今天看书的时候看到了局部内部类,书上说局部内部类可以访问局部变量,但是必须是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);

}
}

...全文
3268 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly_LAN 2018-08-13
  • 打赏
  • 举报
回复
为啥我的Java8 访问不到啊
296497132 2016-12-20
  • 打赏
  • 举报
回复
引用 8 楼 vnvlyp 的回复:
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有相同的效果
老哥完美回答
chensideniu 2015-07-30
  • 打赏
  • 举报
回复
引用 8 楼 vnvlyp 的回复:
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有相同的效果
成功的解决了我的疑惑,谢谢
qq_29448025 2015-07-29
  • 打赏
  • 举报
回复
引用 8 楼 vnvlyp 的回复:
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有相同的效果
恩,刚学这个点,回答得太经典了。还以为书写错了呢。
vnvlyp 2014-08-23
  • 打赏
  • 举报
回复
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有相同的效果
01世界里遨游 2014-08-23
  • 打赏
  • 举报
回复
确实是JDK8的新特性之一所导致。
姜小白- 2014-08-23
  • 打赏
  • 举报
回复
跟着这个问题,简单看了一下 jdk8 新特性
一大三千 2014-08-23
  • 打赏
  • 举报
回复
jdk版本的问题啦,我jdk8以下版本必须得设置final,不然报错。oracle又马上要推出java9了,叫我等还停留在java6上的人情何以堪啊!
Sauron1 2014-08-22
  • 打赏
  • 举报
回复
我的jdk1.7。刚试了一下,确实会出现Cannot refer to a non-final variable a inside an inner class defined in a different method错误。估计就是jdk问题,现在用jdk1.8的估计不多吧
于大圣 2014-08-22
  • 打赏
  • 举报
回复
唉,JDK1.6的路过,你可以看一下8的一些新特性的文章
百曉生 2014-08-21
  • 打赏
  • 举报
回复
嗯,可能是吧,jdk8的确多了一些东西,比如接口可以含有方法体等等——http://www.oschina.net/translate/far-sight-look-at-jdk8 jdk7还是不允许的,jdk在不断变化啊
sg19911227 2014-08-21
  • 打赏
  • 举报
回复
可能是吧 我的jdk7.0不行

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧