黑马程序员技术交流社区

标题: 关于局部内部类的一点小疑问,大神们,能不能帮我下 [打印本页]

作者: 陈迎春    时间: 2013-4-11 13:21
标题: 关于局部内部类的一点小疑问,大神们,能不能帮我下
本帖最后由 陈迎春 于 2013-4-11 21:27 编辑

问题:学习局部内部类是,在书中看到这样的一段话:
在方法中定义的内部类智能访问方法中的final类型的局部变量,这是因为在方法中定义的局部变量相当于一个
常量,它的生命周期超出方法运行的生命周期。

请问这句话,结合代码怎么理解

代码如下:
  1. interface OuterInterface
  2. {
  3.         
  4. }

  5. public class OuterClass {
  6.         
  7.         //定义外部类返回OutInterface类型,参数为final String 类型的方法。
  8.         public OuterInterface doit(final String x)//问题一:问什么要定义成final类型呢?
  9.         {
  10.                 //在doit(final String )方法中定义一个内部类
  11.                 class InnerClass implements OuterInterface
  12.                 {
  13. //                        int m = 2;
  14.                         InnerClass(String s)
  15.                         {
  16.                                 s = x;//问题二:怎么是把x 的值赋给s呢?s是InnerClass初始化时传进来的字符串呀?
  17.                                 System.out.println(s);
  18.                         }
  19.                 }
  20.                 return new InnerClass("你好");
  21.                
  22.         }
  23.         
  24.         public static void main(String[] args) {
  25.                
  26.         }

  27. }
复制代码

作者: 胡滨    时间: 2013-4-11 13:24
http://bbs.itheima.com/thread-45163-1-1.html

看看这个问题,里面有你想要的。

{:soso_e181:}
作者: 陈迎春    时间: 2013-4-11 13:46
胡滨 发表于 2013-4-11 13:24
http://bbs.itheima.com/thread-45163-1-1.html

看看这个问题,里面有你想要的。

恩恩,谢谢,认真看了一遍这个帖子,有收获!
但是这句话到底怎么理解呢?

在方法中定义的内部类只能访问方法中的final类型的局部变量
作者: 胡滨    时间: 2013-4-11 13:54
陈迎春 发表于 2013-4-11 13:46
恩恩,谢谢,认真看了一遍这个帖子,有收获!
但是这句话到底怎么理解呢?

java中规定,内部类只能访问外部类中的成员变量,不能访问方法中定义的变量,如果要访问方法中的变量,就要把方法中的变量声明为final(常量)的,因为这样可以使变量全局化,就相当于是在外部定义的而不是在方法里定义的
作者: 陈迎春    时间: 2013-4-11 14:15
胡滨 发表于 2013-4-11 13:54
java中规定,内部类只能访问外部类中的成员变量,不能访问方法中定义的变量,如果要访问方法中的变量,就 ...


那局部内部类不能访问所在方法的非final局部变量吗?
作者: 胡滨    时间: 2013-4-11 14:35
如果不是final的局部变量,方法结束了就没了,你的内部类却不是和你的方法同时执行的,比如实现ActionListener,当你事件发生的时候才会执行,这时你的方法已经结束了,ActionListener找不到这个局部变量了
作者: 陈宇鹏    时间: 2013-4-11 16:13
胡滨 发表于 2013-4-11 13:24
http://bbs.itheima.com/thread-45163-1-1.html

看看这个问题,里面有你想要的。

额。。额。。额。。。{:3_49:}
作者: 胡滨    时间: 2013-4-11 19:00
陈宇鹏 发表于 2013-4-11 16:13
额。。额。。额。。。

:handshake  资源复用,省内存。。。
作者: 黄玉昆    时间: 2013-4-11 19:41
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者: 陈迎春    时间: 2013-4-13 11:19
胡滨 发表于 2013-4-11 13:54
java中规定,内部类只能访问外部类中的成员变量,不能访问方法中定义的变量,如果要访问方法中的变量,就 ...

百度了一下:

所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类,访问同一个方法中的局部变量,却必须要加上一个final。
原因是编译程序实现上的困难:内部类对象的生命周期会超过局部变量的生命期。局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。而内部类对象生命期,与其它类一样,当创建一个局部内部类对象后,只有当没有其它人再引用它时,它才能死亡。所以完全可能一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。即:局部类的对象生命期会超过局部变量。 局部内部类的对象访问同一个方法中的局部变量,那么这就要求只要局部内部类对象还活着,那么栈中的那些它要访问的局部变量就不能“死亡”(否则:它都死了,还访问个什么呢?)。这就是说:局部变量的生命期至少等于或大于局部内部类对象的生命期。 解决方法:局部内部类的对象可以访问同一个方法中被定义为final的局部变量。定义为final后,编译程序的实现方法:将所有的局部内部类对象要访问的final型局部变量,都拷贝成为该内部类对象中的一个数据成员。这样,即使栈中局部变量(含final)已死亡,但由于它是final,其值永不变,因而局部内部类对象在变量死亡后,照样可以访问final型局部变量。(这一点我有些怀疑)
归纳总结:局部内部类对象中包含有要访问的final型局部变量的一个拷贝,成为它的数据成员。因此,正是在这个意义上,final型局部变量的生命期,超过其方法的一次调用。严格来说,方法调用结束,所有的局部变量(含final)全死亡了。但:局部内部类对象中有final型局部变量的拷贝。




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