黑马程序员技术交流社区

标题: 方法中的内部类疑问,理解不深勿入~~~~ [打印本页]

作者: yangfengxiao    时间: 2012-9-30 08:46
标题: 方法中的内部类疑问,理解不深勿入~~~~
本帖最后由 yangfengxiao 于 2012-9-30 10:01 编辑
  1. class Outer {
  2. void show() {
  3. final int num = 5;   为什么num要定义成final呢?? 别人的解释如下。方法中的局部变量在栈中被创建;当方法调用结束时,释放栈空间。内部类对象生命期是和其它类一样,创建一个局部内部类对象后,当没有其它类再引用时,它才释放。所以局部类的对象生命期会超过局部变量。
  4. 现在的问题是。关于内部类对象和局部变量的生命周期在我代码中是如何体现呢?或者以别的方式给我讲懂吧~~~
  5. class Inner {
  6. void fun() {
  7. System.out.println(num);
  8. }
  9. }
  10. Inner in = new Inner();
  11. in.fun();
  12. }
  13. }

  14. public class Test {
  15. public static void main(String[] args) {
  16. Outer out = new Outer();
  17. out.show();
  18. }

  19. }
复制代码

作者: 张淼    时间: 2012-9-30 09:13
本帖最后由 张淼 于 2012-9-30 09:36 编辑

方法中的内部类只能访问方法中被定义为final的局部变量,而不能访问方法中的非final变量。
原因:        这是由方法中局部变量的生命周期与方法中内部类的生命周期的不同导致的。        
        当方法运行结束后,方法内的局部变量就不存在了,而方法中的内部类对象可能还存在,
        所以,若可以访问方法中的局部变量的话,就造成了该对象访问了一个不存在的变量。
        其解决办法是将变量复制了一份到内部类中,而如果不定义为final的话,当修改了变量时,
        就会造成原变量与复制后的变量的值不一致的情况。当定义为final时,其值不可以被改变,
        所以可以保证所复制的值与原值相同。
        这样,将变量定义为final,就解决了这种调用问题。

        这样说可以理解么?
----------------------------------好的,下面说下例子里面的----------------------------------

作者: 张淼    时间: 2012-9-30 09:37
张淼 发表于 2012-9-30 09:13
方法中的内部类只能访问方法中被定义为final的局部变量,而不能访问方法中的非final变量。
原因:         ...

已重新编辑,你再看看吧。
作者: 郭阳    时间: 2012-9-30 10:02


作者: 尤洋    时间: 2012-9-30 10:05
这个问题每隔几天就有人问一次
其实说更直白点,
局部内部类是不能调用外部的局部变量的
它只是通过了一种拷贝方式达到了看似调用的效果。Java采用了一种copy   local   variable的方式来实现
也就是将外面的局部变量复制到 内部类中
但是这样有一个缺陷:如果在inner里对该复制的局部变量进行赋值操作,那么外边的x并不会被改变。所以为了保证内外的一致性
才要求 设定为final 终态 不可改变




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