A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© axing110 中级黑马   /  2014-10-20 22:39  /  1654 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这个问题困扰我很久了,开始我以为是老师讲错了,后来在百度上发现说法都一样那是我错了吗?是关于局部内部类访问成员变量时,为什么必须申明为final。但是我怎么操作确都可以,是我的问题么?附上图片一张

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

16 个回复

倒序浏览
图不完整啊,看不见,,
回复 使用道具 举报
  1. class aaaa
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 new name().method(7);
  6.         }
  7. }
  8. class name
  9. {

  10.         void method(int a)
  11.         {
  12.                 int y=4;
  13.                 class Inner
  14.                 {
  15.                         void function()
  16.                         {
  17.                                 System.out.println(y+"::"+a);
  18.                         }
  19.                        
  20.                 }
  21.                 new Inner().function();
  22.         }
  23. }
复制代码
回复 使用道具 举报
这个事代码你看看撒
回复 使用道具 举报
不是楼主的问题,也不是老师讲的问题。而是JDK。刚开始练习好像都会这样http://bbs.itheima.com/forum.php?mod=viewthread&tid=147900
回复 使用道具 举报
感谢终于解决了,我说吗原来是新特性啊感谢
回复 使用道具 举报
踏云 中级黑马 2014-10-20 23:21:04
7#
我从两者的生命周期说起吧函数运行是在内存栈中运行的,局部变量生命周期是从定义开始到出了作用域,一出作用域就消失
对象的生命周期是从创建开始到对象被垃圾回收器回收。

当函数运行到局部变量和局部类时创建了局部变量和局部类的对象。局部类的对象引用了局部变量。
如果局部变量不是final修饰的,那当函数运行完时,局部变量就要消失,而局部类的对象还不会消失(要垃圾回收器回收)
所以这就矛盾了。

sun是这样解决这个问题的,他将变量修饰成final,当局部类调用这个变量的时候,其实不是在调用这个变量,只是复制了这个变量的一个引用,

不知道这样解释清不清楚。

回复 使用道具 举报
mudao 中级黑马 2014-10-20 23:32:36
8#
1.8的新特性吗?学习了。
回复 使用道具 举报
恩感谢,我懂了呵呵谢谢
回复 使用道具 举报
:)感谢版主感谢黑马
回复 使用道具 举报
我记得老师讲的是局部变量,不是成员变量,可能是我基础了吧~
回复 使用道具 举报
这个问题我也纠结过,你尝试这把值改变一下就知道,其实还是加的有final的。好像隐藏了。就像interface前面的前缀一样。
回复 使用道具 举报
哇,原来如此啊。。。。学习了
回复 使用道具 举报
有人问了的说
回复 使用道具 举报
呵呵黑马提问论坛真不错,基本问题提问了马上又解答,感谢黑马!!!顶顶顶
回复 使用道具 举报
1.8的新特性。。。。。
回复 使用道具 举报
是的但是原理还是一样,只不过不老师讲的时候还没有加入这个。呵呵感谢同仁
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马