黑马程序员技术交流社区

标题: 半天没找出问题在哪。求教! [打印本页]

作者: skill20    时间: 2014-5-5 14:33
标题: 半天没找出问题在哪。求教!
  1. public class OuterTest1 {
  2.         public static void main(String[] args){
  3.                 new Outer().method();
  4.         }
  5. }
  6. class Outer{
  7.         private int  num = 2;
  8.         public void method(){
  9.                 int a = 9;  // 这里要用final来修饰,但我没用为什么不报错?
  10.                 class In{
  11.                         public void show(){
  12.                                 System.out.println("a=" + a);
  13.                         }
  14.                 }
  15.         new In().show();
  16.         }
  17. }
复制代码


作者: 神马    时间: 2014-5-5 14:47
的确是会报错的,我把你的代码复制然后编译了,命令行跟eclipse都报错了
D:\MyCode\Practice\src\mytry>javac shi3.java
shi3.java:20: 错误: 从内部类中访问本地变量a; 需要被声明为最终类型
                                System.out.println("a=" + a);
                                                          ^
1 个错误
建议楼主重装下jdk吧
作者: 你为谁归来    时间: 2014-5-5 14:59
内部类定义在局部的时候,可以直接访问外部类的成员,但是不能访问它所在的局部中的不加final的变量,而你的a是定义在内部类中的不是定义在外部类的局部变量上面的,所以不加final也可以访问的。

这个问题以前有人问过,给你带个连接
http://bbs.itheima.com/thread-114095-1-1.html
作者: zhangle    时间: 2014-5-5 15:29
实验了一下,确实报错了,是不是你修改后没保存,运行的是上次正确编码时的结果
作者: skill20    时间: 2014-5-5 15:30
你为谁归来 发表于 2014-5-5 14:59
内部类定义在局部的时候,可以直接访问外部类的成员,但是不能访问它所在的局部中的不加final的变量,而你 ...

是定义在局部啊,函数里呢,不在内部类里。
作者: skill20    时间: 2014-5-5 15:31
神马 发表于 2014-5-5 14:47
的确是会报错的,我把你的代码复制然后编译了,命令行跟eclipse都报错了
D:\MyCode\Practice\src\mytry>jav ...

我用Eclipse也报错,就是用Dos不报错,郁闷ing,找半天没找到啥问题。
作者: yemenglin    时间: 2014-5-5 15:37
在Eclipse和Dos下编译都报错,a必须定义成final
作者: 大恶魔先森~    时间: 2014-5-5 16:03
这你就犯了一个问题了。内部类中或者匿名内部类中,要想访问方法中的局部变量或者参数,必须要用final修饰。
原因在于:
                  内部类或者匿名内部类是定义在方法中,方法中的变量或者参数对于它来说是局部变量。局部变量会随着方法的结束而被内存释放,但是内部类却不会随着方法的结束而停止。所以要想在内部类或者匿名内部类中访问方法中的局部变量,必须要扩大此变量的作用域,所以只有定义为final时,才能被访问到。
作者: skill20    时间: 2014-5-5 16:09
大恶魔先森~ 发表于 2014-5-5 16:03
这你就犯了一个问题了。内部类中或者匿名内部类中,要想访问方法中的局部变量或者参数,必须要用final修饰 ...

恩,谢谢啦!我的主要问题呢,是没找出Dos怎么不报错。
作者: 张然龙    时间: 2014-5-7 21:58
你这叫内部函数访问内部类中的成员变量!
如果你想要加final的变量我给你贴上代码你参考下!看注释位置那个变量。

代码如下↓

  1. interface Interface
  2. {
  3.         void show();
  4. }
  5. class Wai
  6. {
  7.         public void method()
  8.         {
  9.                 final int num=10;//你把这final去掉绝对报错 你可以试一下!
  10.                 new Interface()
  11.                 {
  12.                         public void show()
  13.                         {
  14.                                 System.out.println(num);
  15.                         }
  16.                 }.show();
  17.         }
  18. }

  19. class Demo4
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 new Wai().method();
  24.         }
  25. }
复制代码


作者: skill20    时间: 2014-5-7 22:04
张然龙 发表于 2014-5-7 21:58
你这叫内部函数访问内部类中的成员变量!
如果你想要加final的变量我给你贴上代码你参考下!看注释位置那 ...

额,我想问的是我这里咋不报错。。。Dos窗口下,在Eclipse下报错。
作者: 张然龙    时间: 2014-5-7 22:08
我说了啊 你这叫内部函数访问内部类中的成员变量!

你就想想 你创建个类,类中有成员变量,那你的方法要访问本类中的成员变量如果全都要加上final那不乱套了?
作者: skill20    时间: 2014-5-7 22:19
张然龙 发表于 2014-5-7 22:08
我说了啊 你这叫内部函数访问内部类中的成员变量!

你就想想 你创建个类,类中有成员变量,那你的方法要访 ...

:L 我这个是方法里的内部类,访问方法的局部变量,而且没有final修饰,这是会报错的,但我的Dos命令窗口不给我报错,我想知道的是这个。。。
作者: 张然龙    时间: 2014-5-7 22:22
本帖最后由 张然龙 于 2014-5-7 22:25 编辑
skill20 发表于 2014-5-7 22:19
我这个是方法里的内部类,访问方法的局部变量,而且没有final修饰,这是会报错的,但我的Dos命令窗口 ...

哦 。。。我看错了 但是我的编译失败了 你再去试一下?
Exception in thread "main" java.lang.Error: 无法解析的编译问题:
        不能引用另一方法中定义的内部类中非终态变量 a

        at math.Outer$1In.show(Demo4.java:16)
        at math.Outer.method(Demo4.java:19)
        at math.Demo4.main(Demo4.java:7)



作者: skill20    时间: 2014-5-7 22:26
张然龙 发表于 2014-5-7 22:22
哦 。。。我看错了 但是我的编译失败了 你再去试一下?
Exception in thread "main" java.lang.Error: 无 ...

恩,就是找了半天没找到是怎么回事,在Eclipse下没问题的。会提示有错误。。。
作者: wanghe826    时间: 2014-5-7 22:32
你为谁归来 发表于 2014-5-5 14:59
内部类定义在局部的时候,可以直接访问外部类的成员,但是不能访问它所在的局部中的不加final的变量,而你 ...

你是不是看错了,楼主定义的这个a的确是外部类的局部变量!所以肯定要加final修饰的




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