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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

想了半天还是理不清 内部类调用局部变量的内存过程,好凌乱

5 个回复

倒序浏览
局部类才能调用局部变量 而且要加上Final修饰符
回复 使用道具 举报
不明白你想表达什么
回复 使用道具 举报
内部类也是一个类,这个类可以直接创建自己的对象,而这时候外部类并没有调用他的这个方法,所以这个局部变量也就没有再内存中存在 那么也就不能访问到,   这是我个人的观点  不知道是否正确。:D

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
因为生命周期不一样啊 ,类的生命周期大于局部变量啊
回复 使用道具 举报
/*
  题目:方法中的内部类能不能访问方法中的局部变量,为什么?
           答:方法中的内部类访问局部变量的时候,局部变量需要被 final 关键字修饰。
           因为方法中的代码是由上而下顺序执行的,方法运行结束后,局部变量就被销毁,
           内部类的生命周期可能会比局部变量的生命周期长;看下面的代码,方法中的内部
           类 Inner.class 调用方法中的局部变量 x ,正常调用的时候内部类能够调用到方
           法中的局部变量,并将内部类对象 inner 返回,正常调用结束后,如果方法中的局
           部变量 x 没有被 final 关键字修饰,x 则会被销毁,我们再通过反射的方式去调用 x
           的时候则会发现找不到变量 x ,如果局部变量 x 被 final 关键字修饰后,则 x 在方
           法运行结束后不会被销毁,而是常驻在内存中直到 JVM 退出,这样再通过反射调用的
           时候依然可以找到 x 。
*/
  1. public class Test12 {
  2.         public static void main(String[] args) throws Exception {
  3.                 Outer outer = new Outer(); // 正常调用
  4.                 Object object = outer.outerfun();

  5.                 Class clazz = object.getClass(); // 反射调用
  6.                 Method method = clazz.getMethod("innerfun");
  7.                 method.invoke(object);
  8.         }
  9. }

  10.         class Outer {
  11.                 public Object outerfun() {
  12.                         final int x = 5;
  13.                 class Inner {                                                //内部类Inner
  14.                         public void innerfun() {
  15.                                 System.out.println(x);
  16.                         }
  17.                 }
  18.                         Inner inner = new Inner();
  19.                         inner.innerfun();
  20.                         return inner;
  21.                 }
  22.        
  23. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马