匿名内部类的使用

2019-08-15  本文已影响0人  拾月初六

1.匿名内部类中局部变量的使用

在JDK8中,匿名内部类使用局部变量不再要求局部变量使用final修饰,那么是否我们就不会再发生Local variable *** defined in an enclosing scope must be final or effectively final 的错误嗯,其实还是会有的,下面我们看下会有什么情况依旧编译报错。

        String str1 = "hello";
        new Thread(){
            @Override
            public void run() {
                System.out.println(str1);
            }
        }.start();

首先在这个例子里,我们可以看到,普通的使用一个局部变量是不要求final修饰的。
但是下面这种对变量进行了初始化赋值,然后再次指向一个新对象时就会出现问题了。

        String str2 = null;
        /*str2做了判断再赋值*/
        if("hello".equals(str1)){
            str2 = "world1";
        }else{
            str2 = "world2";
        }
        new Thread(){
            @Override
            public void run() {
                System.out.println(str2);
            }
        }.start();

此时的System.out.println(str2)这里就提示编译报错了。
这里报错的原因就是str2这个变量在编译器看来,不再具有唯一性了,更深的底层原理需要再研究。
我们这里讲下这种问题的解决棒法。
1: 将变量重新赋值给另外一个引用。如用str3指向str2的对象,内部类里面使用str3就可以了。
如图

2: 将对象做为数组的一部分,内部类中使用数组获取对象再使用也可以解决问题,如图。


原理都是将我们需要的数据重新绑定到一个编译器认为具有final性的引用里面就可以了,所以只要知道原理, 也可以自己灵活变动解决问题了。

上一篇下一篇

猜你喜欢

热点阅读