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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© huangweicong 中级黑马   /  2016-10-22 02:29  /  648 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

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

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

        class Outer {
                public Object outerfun() {
                        final int x = 5;
                class Inner {                                                //内部类Inner
                        public void innerfun() {
                                System.out.println(x);
                        }
                }
                        Inner inner = new Inner();
                        inner.innerfun();
                        return inner;
                }
       
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马