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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

局部内部类如何访问局部变量     那位同学帮忙解答一下   

7 个回复

倒序浏览
   求解
回复 使用道具 举报
只能访问被final修饰的局部变量吧
回复 使用道具 举报
回复 使用道具 举报
能不能  解答的  详细一点啊
回复 使用道具 举报
方法中的内部类如果要访问局部变量就必须把局部变量设置成final类型。
为什么要设置成final局部变量才能被访问:
       
        例如:方法go开始,初始化匿名内部类Timer子类,并调用start()方法启动定时器,方法actionPerformed 被调用,go方法结束,此时go方法的delay和flag不复存在。
        所以在方法go结束后,定时如果要继续进行必须把flag声明为final。
        public void go(final boolean flag){
                final long delay;
                class Inner{
                        new Timer(a,new ActionListener(){
                                public void actionPerformed(ActionEvent e){
                                        if(flag){
                                                System.out.println("one second");
                                        }
                                }
                        }).start();
                }
        }
        为了让actionPerformed方法继续工作。编译器会检测对局部变量的引用,并在内部类初始化的时候通过构造器把参数传入局部内部类的拷贝域中,把它们初始化为局部变量的副本。由于flag是final常量,初始化之后无法更改,所以在内部类的拷贝和局部变量始终是一致的。
        上面例子中的timer是一个定时器,楼主只要知道在go()这个方法执行结束之后,还有Inner这个匿名内部类的一个实例存在,并且还会调用它的方法。
回复 使用道具 举报
一个类中的内部类,其实这个内部类相对这个类就和以他方法和属性一样的。只是内部类的生命周期和这个类的属性生命周期是不同的。 在内存中,类的属性会被分配到栈中的。当调用结束的时候就会退栈,也就是说在内存中这个属性就消失了。内部类也是类,只用在内存 中对他的引用消失了才会死亡的内部类,这个时候内部类调用类中已经结束调用的属性是不可能的。也就是说局部类的生命周期超过了类的 局部变量。解决的办法就是在局部变量前加上final,这样类中属性就会被分配在堆内存中,生命周期是和工程的生命周期一样了,其内部类 就可以调用了。
回复 使用道具 举报
一江夜雨 发表于 2015-11-25 18:57
一个类中的内部类,其实这个内部类相对这个类就和以他方法和属性一样的。只是内部类的生命周期和这个类的属 ...

正解!!!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马