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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Wokno 中级黑马   /  2014-6-5 15:46  /  1360 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  编译通过,运行正常,并没有要求用“final”修饰变量“val”。
  1. class Outer {
  2.         int num = 3;
  3.        
  4.         void method() {
  5.                 int val = 8;
  6.                
  7.                 class Inner {        //局部类
  8.                         void function() {
  9.                                 System.out.println("val = "+val);
  10.                                 }
  11.                         }
  12.                        
  13.                 new Inner().function();
  14.                 }
  15.         }
  16.        
  17. class LocalClass {
  18.         public static void main(String[] args) {
  19.                 new Outer().method();
  20.                 }
  21.         }
复制代码



9 个回复

倒序浏览
本帖最后由 饥渴ing 于 2014-6-5 18:21 编辑

你要是在main方法里创建内部类对象就需要了
开来我要回炉从造内部类了.
回复 使用道具 举报 1 0
我把你的代码放在了MyEclipse6.5里运行,发生如下报错:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
        Cannot refer to a non-final variable val inside an inner class defined in a different method

        at Outer.method(LocalClass.java:9)
        at LocalClass.main(LocalClass.java:19)
当把val变量前面加上final后,运行正常。不知怎么回事儿。
回复 使用道具 举报 0 1
你那个代码在我的机器上跑着出错了
外部局部变量需要加上final修饰  
外部全局变量:
如果在内部类中有和外部类相同变量的名称 需要 类名.this.变量
如果内部类中没有重名变量  则可以直接调用
回复 使用道具 举报
饥渴ing 发表于 2014-6-5 17:09
你要是在main方法里创建内部类对象就需要了
开来我要回炉从造内部类了.

刚测试了下,还是不需要。

回复 使用道具 举报 1 0
提菩--空 发表于 2014-6-5 17:41
我把你的代码放在了MyEclipse6.5里运行,发生如下报错:
Exception in thread "main" java.lang.Error: Unr ...

我是用UltraEdit编辑的。。。还没用Eclipse。。。。
回复 使用道具 举报
苗润 发表于 2014-6-5 19:08
你那个代码在我的机器上跑着出错了
外部局部变量需要加上final修饰  
外部全局变量:

刚copy下来重新测试了下,没问题。。。

回复 使用道具 举报
Wokno 发表于 2014-6-5 20:00
刚copy下来重新测试了下,没问题。。。

我也是copy的  我的java 版本是7.0

Q9VKOK)3)9]VUKGOG]~IT6W.jpg (38.46 KB, 下载次数: 1)

Q9VKOK)3)9]VUKGOG]~IT6W.jpg
回复 使用道具 举报
苗润 发表于 2014-6-5 20:22
我也是copy的  我的java 版本是7.0

我的是1.8.0的,。。。

回复 使用道具 举报
Wokno 发表于 2014-6-5 20:28
我的是1.8.0的,。。。

你说这个问题应该是新版本特性,你可以通过反射 查看得到的class文件   java里面帮你简化了操作,隐藏了部分流程, 通过反射可以发现  在内部类里面  多了一个你没定义的引用,内部类在构造方法里面初始化了这个引用,因此你可以调用外部类的东西
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马