黑马程序员技术交流社区

标题: 内部类访问局部变量 关于final关键字的细节 [打印本页]

作者: hoop.zeng    时间: 2015-5-4 15:33
标题: 内部类访问局部变量 关于final关键字的细节
在自学视频中看到第九天,讲到内部类定义在局部时,访问它所在的局部中的变量,若该变量不加final关键字会编译报错,视频中也有代码的编译演示。
但我敲了代码,局部变量没加final,能正常编译运行。代码如下:
  1. class  J9_1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 //新建外部类对象调用其中的Func方法
  6.                 new Out().Func();
  7.         }
  8. }
  9. class Out
  10. {
  11.         void Func()
  12.         {
  13.                 int y =1;
  14.                 //定义在局部中的内部类In
  15.                 class In
  16.                 {
  17.                         //定义show方法,输出局部变量y
  18.                         void show()
  19.                         {
  20.                                 System.out.println("In:"+y);
  21.                         }
  22.                 }
  23.                 //新建内部类In对象,并调用他的show方法
  24.                 new In().show();
  25.         }
  26. }
复制代码

运行结果是:In:1。
为了解开疑惑,我添加语句y=2,将y再次赋值。会报如下错误:
错误:从内部类引用的本地变量必须是最终变量或实际上的最终变量。

我的结论:
1.内部类定义在局部时,对于它所在局部的变量,只能访问final修饰过的局部变量
2.我用的是jdk1.80_31,若访问没被final修饰过的变量,不会报错,能编译运行。但会自动将该变量添加
final关键字,该变量不能被重复赋值。
作者: laine    时间: 2015-5-4 16:08
因为内部类实例化后存储在堆中;局部变量存储在栈中,局部变量随着调用方法的结束而被释放,因此内部类不能去访问一个声明周期已经结束的局部变量




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2