黑马程序员技术交流社区

标题: 内部类定义在局部时的问题 [打印本页]

作者: 小飞龙    时间: 2013-3-3 00:06
标题: 内部类定义在局部时的问题
当内部类在一个成员位置上时,相当于一个成员,能别成员修饰符修饰,能访问外部类的成员。
     为什么当内部类定义在局部时就有些不能了呢? 这里定义成局部是不是意思 说该内部类放在一个方法中?     这时不可以被成员修饰符修饰, 不可以访问其所在局部中的局部变量。  
     但是该内部类在这个局部中和那些局部变量不是平等的关系吗?怎么就不能访问了呢? 也作为局部中的一个成员,怎么就不能被修饰呢?


  要是说 局部变量的数据是因为 随着 方法的存在而放在 栈 内存中,随方法消失而消失。 那调用该内部类不是肯定会加载这个方法的嘛。 那么这些局部变量不是也会存在。
作者: 张豪杰    时间: 2013-3-3 00:48
内部类定义在局部时,就是指在将内部类定义在方法中,可以称它为方法内部类;这一点楼主的猜测是对的
但是后面那句话错了,"不可以访问其所在局部中的局部变量"
应该说“方法内部类对象不能使用该内部类所在方法的非final局部变量
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。

作者: 张豪杰    时间: 2013-3-3 00:53
张豪杰 发表于 2013-3-3 00:48
内部类定义在局部时,就是指在将内部类定义在方法中,可以称它为方法内部类;这一点楼主的猜测是对的
但是 ...

还要补充一下:方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
附上代码
  1. class Outer {
  2.         public void doSomething(){
  3.            final int a =10;
  4.            class Inner{
  5.                 public void seeOuter(){
  6.                     System.out.println(a);
  7.               }            
  8.            }
  9.             Inner in = new Inner();
  10.             in.seeOuter();
  11.         }
  12.         public static void main(String[] args) {
  13.             Outer out = new Outer();
  14.             out.doSomething();
  15.         }
  16. }
复制代码

作者: 夏晓彤    时间: 2013-3-3 01:53
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用消失时,内部类才会消亡。而方法的局部变量是存储在堆栈中的,当调用结束时就会退栈,即在内存中这个属性就消失了。也就是说,内部类的生命周期超过了方法中局部变量的生命周期,内部类可能会调用到已经消失的属性,因此内部类不能访问方法中的局部变量。
解决方法就是在局部变量前加修饰符final ,此时局部变量就会存在堆中,生命周期跟工程的生命周期是一样的,此时内部类就可以访问方法中的局部变量。
作者: 何伟    时间: 2013-3-3 12:03
方法中的内部类不能访问方法中局部变量.
因为内部类和类的成员属性生命周期是不一样的
在内存中,局部变量是存在于栈或堆中,而内部类也是类,它在编译时也会有class文件,jvm根本不知道有内部这东西,
当方法调用结束后,就会弹栈,就是消失在内在中,
而当对该类的引用消失,内部类才会消失,
也就是说,内部类的生命周期超过了方法中局部变量的生命周期,
内部类可能会调用到已经消失的属性,因此内部类不能访问方法中的局部变量。
如果内部类想要访问局部变量,只要该变量用final修饰就可以了
解决办法:被final修饰后该变量就存在于方法区,生命周期和内部类一致
此时内部类就可以访问方法中的局部变量了
作者: 黄玉昆    时间: 2013-3-4 16:17
何伟 发表于 2013-3-3 12:03
方法中的内部类不能访问方法中局部变量.
因为内部类和类的成员属性生命周期是不一样的
在内存中,局部变量是 ...

我说一下啊,局部变量和局部类确实生命周期是不一样的。但对于局部变量消失的话,局部内部类不一定会消失的。
作者: 黑马-陈思源    时间: 2013-3-4 17:05
谢谢各位大神~~~~路过  又懂了点知识




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