匿名内部类的使用

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性的引用里面就可以了,所以只要知道原理, 也可以自己灵活变动解决问题了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 内部类和外部类的区别及内部类的创建: 1. 成员内部类可以使用外部类的成员变量和成员方法 2. 【在Outer类的...
    YaphetS081阅读 3,633评论 0 0
  • 直接代码
    俊才F阅读 1,243评论 0 0
  • 从网上复制的,看别人的比较全面,自己搬过来,方便以后查找。原链接:https://www.cnblogs.com/...
    lxtyp阅读 5,174评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,904评论 1 32
  • 当被问到 final 修饰符,我们通常会随口而出以下3句话: 被 final 修饰的变量被赋初始值后,不能再重新赋...
    CoderJed阅读 5,621评论 0 1

友情链接更多精彩内容