美文网首页
匿名内部类的使用

匿名内部类的使用

作者: 拾月初六 | 来源:发表于2019-08-15 12:01 被阅读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性的引用里面就可以了,所以只要知道原理, 也可以自己灵活变动解决问题了。

    相关文章

      网友评论

          本文标题:匿名内部类的使用

          本文链接:https://www.haomeiwen.com/subject/zfaajctx.html