黑马程序员技术交流社区

标题: 局部类访问其同层次的变量问题! [打印本页]

作者: Wokno    时间: 2014-6-5 15:46
标题: 局部类访问其同层次的变量问题!
  编译通过,运行正常,并没有要求用“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.         }
复制代码




作者: 饥渴ing    时间: 2014-6-5 17:09
本帖最后由 饥渴ing 于 2014-6-5 18:21 编辑

你要是在main方法里创建内部类对象就需要了
开来我要回炉从造内部类了.

作者: 提菩--空    时间: 2014-6-5 17:41
我把你的代码放在了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后,运行正常。不知怎么回事儿。
作者: 苗润    时间: 2014-6-5 19:08
你那个代码在我的机器上跑着出错了
外部局部变量需要加上final修饰  
外部全局变量:
如果在内部类中有和外部类相同变量的名称 需要 类名.this.变量
如果内部类中没有重名变量  则可以直接调用
作者: Wokno    时间: 2014-6-5 19:53
饥渴ing 发表于 2014-6-5 17:09
你要是在main方法里创建内部类对象就需要了
开来我要回炉从造内部类了.

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


作者: Wokno    时间: 2014-6-5 19:58
提菩--空 发表于 2014-6-5 17:41
我把你的代码放在了MyEclipse6.5里运行,发生如下报错:
Exception in thread "main" java.lang.Error: Unr ...

我是用UltraEdit编辑的。。。还没用Eclipse。。。。
作者: Wokno    时间: 2014-6-5 20:00
苗润 发表于 2014-6-5 19:08
你那个代码在我的机器上跑着出错了
外部局部变量需要加上final修饰  
外部全局变量:

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


作者: 苗润    时间: 2014-6-5 20:22
Wokno 发表于 2014-6-5 20:00
刚copy下来重新测试了下,没问题。。。

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

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

Q9VKOK)3)9]VUKGOG]~IT6W.jpg

作者: Wokno    时间: 2014-6-5 20:28
苗润 发表于 2014-6-5 20:22
我也是copy的  我的java 版本是7.0

我的是1.8.0的,。。。


作者: 苗润    时间: 2014-6-5 21:47
Wokno 发表于 2014-6-5 20:28
我的是1.8.0的,。。。

你说这个问题应该是新版本特性,你可以通过反射 查看得到的class文件   java里面帮你简化了操作,隐藏了部分流程, 通过反射可以发现  在内部类里面  多了一个你没定义的引用,内部类在构造方法里面初始化了这个引用,因此你可以调用外部类的东西




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