不能,因为方法中的内部类的生命周期可能比方法中的局部变量的生命周期要长。
内部类存储在堆内存中,只有当对内部类的全部引用消失时,内部类才会被垃圾回收。
而方法中的局部变量存储在栈内存当中该方法的栈帧中,当该方法执行完毕,栈帧会弹出,局部变量也会跟着消失。
如果在方法执行完毕后,方法中的内部类还能被其他地方引用,
那么方法中的内部类的生命周期就会比方法中的局部变量要长,此时局部变量已经消失,当然就更不可能访问到。
如果局部变量被final修饰,方法中的内部类就能访问这个局部变量了。
下面的代码演示方法中的内部类的生命周期比方法中的局部变量长的情况:
当代码执行到主函数的第二行,调用show方法执行完毕后,show方法中x变量已经在内存中消失。
而此时内部类Inner的引用inner仍然保留,仍然能调用print方法,如果print方法能访问x,此时将产生不可预知的结果。- interface InnerInterface{
- public void print();
- }
- //外部类
- class Outer{
- Object inner;
- //外部类成员方法
- public InnerInterface show(){
- //方法中的局部变量
- int x=2;
- final int y=3;
-
- //方法中的内部类
- class Inner implements InnerInterface{
- // int z=x;//方法中的内部类的成员变量也不能访问方法中的局部变量,否则编译报错
- public void print(){
- // System.out.println(x);//方法中的内部类的成员函数中,也不能访问方法中的局部变量,否则编译报错
- System.out.println("y="+y);//可以访问被final修饰的变量
- }
- }
-
- return new Inner();
- }
- }
- public class Test1 {
- public static void main(String[] args){
- //调用show方法,执行完毕后,show方法中x变量已经在内存中消失
- InnerInterface inner= new Outer().show();
- //而此时内部类Inner的引用inner仍然保留,仍然能调用print方法
- inner.print();
- }
- }
复制代码
|