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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在自学视频中看到第九天,讲到内部类定义在局部时,访问它所在的局部中的变量,若该变量不加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关键字,该变量不能被重复赋值。

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

1 个回复

倒序浏览
因为内部类实例化后存储在堆中;局部变量存储在栈中,局部变量随着调用方法的结束而被释放,因此内部类不能去访问一个声明周期已经结束的局部变量
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马