A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小飞龙 初级黑马   /  2013-3-3 00:06  /  2191 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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


  要是说 局部变量的数据是因为 随着 方法的存在而放在 栈 内存中,随方法消失而消失。 那调用该内部类不是肯定会加载这个方法的嘛。 那么这些局部变量不是也会存在。

评分

参与人数 1技术分 +1 黑马币 +1 收起 理由
黄玉昆 + 1 + 1 多看看内部类的总结,可以在论坛中搜索内部.

查看全部评分

6 个回复

倒序浏览
内部类定义在局部时,就是指在将内部类定义在方法中,可以称它为方法内部类;这一点楼主的猜测是对的
但是后面那句话错了,"不可以访问其所在局部中的局部变量"
应该说“方法内部类对象不能使用该内部类所在方法的非final局部变量
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张豪杰 发表于 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. }
复制代码
回复 使用道具 举报
内部类的生命周期和方法中的局部变量是不一样的,内部类是也是一个类,是存储在堆中,也只有当对该类的引用消失时,内部类才会消亡。而方法的局部变量是存储在堆栈中的,当调用结束时就会退栈,即在内存中这个属性就消失了。也就是说,内部类的生命周期超过了方法中局部变量的生命周期,内部类可能会调用到已经消失的属性,因此内部类不能访问方法中的局部变量。
解决方法就是在局部变量前加修饰符final ,此时局部变量就会存在堆中,生命周期跟工程的生命周期是一样的,此时内部类就可以访问方法中的局部变量。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
方法中的内部类不能访问方法中局部变量.
因为内部类和类的成员属性生命周期是不一样的
在内存中,局部变量是存在于栈或堆中,而内部类也是类,它在编译时也会有class文件,jvm根本不知道有内部这东西,
当方法调用结束后,就会弹栈,就是消失在内在中,
而当对该类的引用消失,内部类才会消失,
也就是说,内部类的生命周期超过了方法中局部变量的生命周期,
内部类可能会调用到已经消失的属性,因此内部类不能访问方法中的局部变量。
如果内部类想要访问局部变量,只要该变量用final修饰就可以了
解决办法:被final修饰后该变量就存在于方法区,生命周期和内部类一致
此时内部类就可以访问方法中的局部变量了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
何伟 发表于 2013-3-3 12:03
方法中的内部类不能访问方法中局部变量.
因为内部类和类的成员属性生命周期是不一样的
在内存中,局部变量是 ...

我说一下啊,局部变量和局部类确实生命周期是不一样的。但对于局部变量消失的话,局部内部类不一定会消失的。
回复 使用道具 举报
谢谢各位大神~~~~路过  又懂了点知识
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马