海阔天空

当前时间为:
欢迎大家来到海阔天空https://www.9713job.com,广告合作以及淘宝商家推广请微信联系15357240395

2020java教程:局部内部类访问外部内部类局部变量为什么要加final

未分类
2020-08-18 13:12:53
1822677238@qq.com

手机扫码查看

2020java教程:局部内部类访问外部内部类局部变量为什么要加final

局部内部类访问外部内部类局部变量为什么要加final

public class demos{
    public static void main(String[] args) {
        Outer out=new Outer();
        out.m1();
    }
}


class Outer{
    int a=10;
    public void m1(){
        /*final*/ String str="Hello";//默认添加final
        class Inner{
            int a=20;
            public void m2(){
                int a=30;
                System.out.println("Inner m2()"+str);
                System.out.println("Inner m2()"+a);
                System.out.println("Inner m2()"+this.a);
                System.out.println("Inner m2()"+Outer.this.a);
            }
        }
        Inner in=new Inner();
        in.m2();
    }
}

局部内部类它整个使用范围在方法内部,作为一个类来讲,可以new它的对象,那么对象在堆里,局部变量在栈里,他们回收时机不同,栈里面的内容会立刻回收,只要范围一跨越出了方法就没有了,但是对象可不会立刻回收,换句话说,这程序方法执行完了,c是局部变量,它会被回收,”hello”是个对象,它在堆里,不回收,Inner in也是局部变量,它要被回收,但是这个对象在堆里,它也不回收,对象会伴随着java虚拟机的垃圾收集器运行时回收。

要区分:

局部变量立即回收,对象是要伴随一个周期的时点做垃圾收集的时候才回收,他们回收时点不一样。

既然对象回收时点要比局部变量更慢,有没有一种可能局部变量被回收,对象还在呢?

这个方法一旦执行完毕,只要程序没停,局部变量肯定没了,但是inner对象还存活着,不要担心new  inner 对象出圈就找不到这对象了。

可以继承也可以实现接口

public class demos{
    public static void main(String[] args) {
        Outer out=new Outer();
        out.m1();
        out.p.print();
    }
}
class Outer{
    int a=10;
    prints p=null;
    public void m1(){
        final String str="Hello";
        class Inner implements prints{
            int a=20;
            @Override
            public void print(){
                int a=30;
                System.out.println("Inner m2()"+str);
                System.out.println("Inner m2()"+a);
                System.out.println("Inner m2()"+this.a);
                System.out.println("Inner m2()"+Outer.this.a);
            }
        }
        p=new Inner();
    }
}
interface prints{
    void print();
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注