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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 方珂 中级黑马   /  2013-7-8 18:47  /  1202 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 方珂 于 2013-7-8 21:16 编辑
  1. public class OutterTest
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.             Outter out = new Outter();
  6.             out.show(13);
  7.     }
  8. }
  9. class Outter
  10. {
  11.     public void show(final int a)// 为什么一定要用final修饰呢?
  12.     {
  13.             class Inner
  14.             {
  15.                     public void show1()
  16.                     {
  17.                             System.out.println(a);
  18.                     }
  19.             }
  20.             new Inner().show1();
  21.     }
  22. }
复制代码
这个匿名内部类使用局部变量为什么一定要用final修饰?



评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

3 个回复

倒序浏览
因为如果不把它开弄成常量,当show方法执行完时a也消失了,但是创建的内部类有可以还没有消失,这样内部类中就引用了一个不存在的值,所以弄成常量,即使方法执行完了这个常量也还是,内部类对象引用它就没有问题

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
在《Core Java 8th Editon》里是这么说的: A local variable that is declared final cannot be modified after it has been initialized. Thus, it is guaranteed that the local variable and the copy that is made inside the local class always have the same value.


其实,需要定义为final的,就是为了防止在调用该变量时,该变量的引用被修改,导致出现无法预料的问题。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
你这个 内部类是定义在了类的方法里面, 。 如果是直接定义在类中, 那么就不需要加最终 可以直接读取, 如果是在类创建的方法里再进行创建内部类的话,  那么 这个内部类只能访问外部类中的变量, 顺便送你一句我在上课时关于局部内部类的笔记
(内部类被定义在局部时, 不可以被成员修饰符修饰
可以直接访问外部类中的成员,因为还持有外部类中的引用,
但是不可以访问它所在位置的局部变量,只能访问被final修饰的局部变量。)

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马