黑马程序员技术交流社区

标题: 内部类问题 [打印本页]

作者: 王亚男    时间: 2012-3-5 10:54
标题: 内部类问题
为什么局部内部类中只能访问所在方法的final变量?
请问这个应该怎么理解呢?
作者: 张开开    时间: 2012-3-5 11:36
这里涉及到一个生命周期问题,不是final的局部变量,你的方法结束了就没了。但是你的内部类却不是和你的方法同时执行的,当你事件发生的时候才会执行,这时你的方法已经结束了,这样应该哪里找这个局部变量呢?
作者: 刘泰    时间: 2012-3-5 12:22
在使用内部类是时候,程序是先执行外部类,当执行到内部类是,外部类的生命周期已经结束
作者: 黄方    时间: 2012-3-5 12:50
额,看你的问题啦:是这样的:
(1)所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类,访问同一个方法中的局部变量,是天经地义的。那么为什么要加上一个final呢?
(2)原因是:编译程序实现上的困难,难在何处:内部类对象的生命周期会超过局部变量的生命期。为什么?表现在:局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建(诞生),当方法调用结束时(执行完毕),退栈,这些局部变量全部死亡。而:内部类对象生命期,与其它类一样,当创建一个该局部类对象后,只有没有其它人再引用它时,它才能死亡。完全可能:一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。即:局部类的对象生命期会超过局部变量。
(3)退一万步:局部类的对象生命期会超过局部变量又怎样?问题的真正核心是:如果:局部内部类的对象访问同一个方法中的局部变量,是天经地义的,那么:只要局部内部类对象还活着,则:栈中的那些它要访问的局部变量就不能“死亡”(否则:它都死了,还访问个什么呢?),这就是说:局部变量的生命期至少等于或大于局部内部类对象的生命期。而:正是这一点是不可能做到的
作者: 王亚男    时间: 2012-3-5 14:01
张开开 发表于 2012-3-5 11:36
这里涉及到一个生命周期问题,不是final的局部变量,你的方法结束了就没了。但是你的内部类却不是和你的方 ...

谢谢您!
我是这样理解的,即使是final修饰的变量,但是方法结束的时候还是会被释放。
所以,我就创建了一个外部类对象,调用function()方法返回并接收一个内部类对象。
这时,function()方法结束了,按正常的理解,这里的x和y都会被释放了,当然x在这不能编译通过。
可是这时候我调用局部内部类的show()方法却依然能打印出y的值。
我在想,会不会是被final修饰的变量会不会在局部内部类有个隐藏的备份?这时候调用的是否就不是方法体中的y了?
如果是这样的话,就能理解为什么要用final修饰了,如果不被final修饰的话,这个变量可以被更改,就意味着局部内部类就不知道该备份哪个数据了吧。
  1. interface Inner
  2. {
  3.         void show();
  4. }
  5. class Outer
  6. {
  7.         public Inner function()
  8.         {
  9.                 //int x = 0;
  10.                 final int y = 1;
  11.                 return new Inner()
  12.                 {
  13.                         public void show()
  14.                         {
  15.                                 //System.out.println("x="+x);
  16.                                 System.out.println("y="+y);
  17.                         }
  18.                 };
  19.                
  20.         }
  21. }
  22. class  OuterClassDemo
  23. {
  24.         public static void main(String[] args)
  25.         {
  26. //                new Outer().function().show();
  27.                 Outer out = new Outer();
  28.                 Inner in = out.function();
  29.                 in.show();
  30.         }
  31. }
复制代码

作者: 王亚男    时间: 2012-3-5 14:03
本帖最后由 qwert 于 2012-3-5 14:07 编辑
舞动的心弦 发表于 2012-3-5 12:50
额,看你的问题啦:是这样的:
(1)所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类, ...


真是谢谢您!我好像理解些了。
一个问题琢磨好几个小时候了,也真是头痛!
太谢谢了!




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