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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡刚涛 中级黑马   /  2012-8-17 09:05  /  1434 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

自己定义了一个内部类见如下代码:
class Outer
{
int x=3;
void run(){
  int y=4;
  class Inner{
   void show(){
    System.out.println(y);//这句代码会报错,以为y必须被定义成最终变量,及final int y=4;为什么呢?
   
   }
  }
  {
  }
}
}
class InnerclassDemo
{
public static void main (String[] args){
  Outer out=new Outer();
  out.run();
}
}
当改为正确的代码后再运行后,求画一个内存图表示一下!!!

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 毛标 于 2012-8-17 10:40 编辑

方法中的内部类访问局部变量的时候,局部变量需要被 final 关键字修饰。因为方法中的代码是由上而下顺序执行的,方法运行结束后,局部变量就被销毁,内部类的生命周期可能会比局部变量的生命周期长;方法中的内部类 Inner.class 调用方法中的局部变量 y,正常调用的时候内部类能够调用到方法中的局部变量,并将内部类对象 inner 返回,正常调用结束后,如果方法中的局部变量 y 没有被 final 关键字修饰,y 则会被销毁,我们再通过反射的方式去调用 y的时候则会发现找不到变量 y,如果局部变量 y 被 final 关键字修饰后,则 y 在方法运行结束后不会被销毁,而是常驻在内存中直到 JVM 退出,这样再通过反射调用的时候依然可以找到 y 。
回复 使用道具 举报
毛标 发表于 2012-8-17 10:18
方法中的内部类访问局部变量的时候,局部变量需要被 final 关键字修饰。因为方法中的代码是由上而下顺序执 ...

哦 意思就是当变量被final修饰后就会常驻在内存中直到 JVM 退出;
哪么 当方法运行完之后内部类什么时候消失呢,它的加载器是哪个?jar存放的位置是哪里呢
回复 使用道具 举报
胡刚涛 发表于 2012-8-17 10:33
哦 意思就是当变量被final修饰后就会常驻在内存中直到 JVM 退出;
哪么 当方法运行完之后内部类什么时候 ...

局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调执行完毕,退栈,这些局部变量全部死亡。内部类对象生命期,与其它类一样,当创建一个该局部类对象后,只有没有其它人再引用它时,它才能死亡。所以当方法调用结束后对象还有人引用它就不会消失
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马