这个你需要看它们的生命周期了,方法的生命周期是随着方法被调用开始,随着方法执行完毕结束的。方法里面的内部类在执行的时候会生成一个对象,这个对象是在堆中。如果用的是方法中的局部变量,那么方法结束的时候,会出现这样的情况,堆里面的对象的属性值为不存在,而我们知道,在java中是不允许出现这样的情况的。你可能会说,这个时候,这个对象虽然没有被垃圾回收机制回收,但是,应该也是没有意义了吧,怎么会考虑这个问题呢,是有这么一种情况的:我们可以把这个对象在方法中作为一个参数传递给其他的方法的。这时候,这个对象的生命周期就可能会长于这个方法,所以就会出现一个不合理的对象被引用。因此,方法中的内部类,不能访问方法中的局部变量。我们通常的解决办法是:1.static修饰,这样的话,会将这个变量放到代码区,这里的变量是随着类的加载而加载,随着类的消失而消失的,所以就可以避免掉刚才的问题。2.我们将这个变量用final修饰,这样变量定义到常量池中,在常量池中的常量是不会消失的,它的消失,是类似于堆中对象的垃圾回收机制一样的。就是说,当指向常量的引用消失,并且常量池空间不够的时候才会被回收的。 |