`

final 与 匿名内部类

    博客分类:
  • java
阅读更多

众所周知,想要在匿名内部类中用匿名内部类外部的变量需要定义成final,为什么呢?

private static ThreadFactory build(ThreadFactoryBuilder builder) {
    final String nameFormat = builder.nameFormat;
    final Boolean daemon = builder.daemon;
    final Integer priority = builder.priority;
    final UncaughtExceptionHandler uncaughtExceptionHandler =
        builder.uncaughtExceptionHandler;
    final ThreadFactory backingThreadFactory =
        (builder.backingThreadFactory != null)
        ? builder.backingThreadFactory
        : Executors.defaultThreadFactory();
    final AtomicLong count = (nameFormat != null) ? new AtomicLong(0) : null;
    return new ThreadFactory() {
      @Override public Thread newThread(Runnable runnable) {
        Thread thread = backingThreadFactory.newThread(runnable);
        if (nameFormat != null) {
          thread.setName(String.format(nameFormat, count.getAndIncrement()));
        }
        if (daemon != null) {
          thread.setDaemon(daemon);
        }
        if (priority != null) {
          thread.setPriority(priority);
        }
        if (uncaughtExceptionHandler != null) {
          thread.setUncaughtExceptionHandler(uncaughtExceptionHandler);
        }
        return thread;
      }
    };
  }

 以上代码中的count本应在build方法执行完后会清理掉,该引用存在于栈内部中,方法结束,变量出栈,该引用指向的对象被gc。

但由于这个count定义成了final,这个时候局部内部类对象中包含有要访问的final型局部变量的一个拷贝,成为它的数据成员。虽然在build方法结束后,这个方法里的count引用出栈,但在由于在匿名内部类中有一份count引用的copy,所以count对象还有引用指向,不会被回收。相当于延长了局部变量count对象的生命周期。

 

 

分享到:
评论

相关推荐

    Java提高篇之详解匿名内部类

    在这篇博客中你可以了解到匿名内部类的使用、匿名内部类要注意的事项、如何初始化匿名内部类、匿名内部类使用的形参为何要为final。  一、使用匿名内部类内部类  匿名内部类由于没有名字,所以它的创建方式有...

    局部内部类和匿名内部类使用局部变量为什么要final1

    //从阅读角度,这里预期打印a=20,然而只会打印出a=10,会让人误解,因为在Inner的change()中修改的是Inner内部类对象的this.a,它是m

    13_Java面向对象_第5天(static、final、匿名对象、内部类、包、修饰符、代码块)_讲义

    13_Java面向对象_第5天(static、final、匿名对象、内部类、包、修饰符、代码块)_讲义

    Java面试题,他会给你很好的Java面试准备,第一,谈谈final, finally, finalize的区别,第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

    很好的Java面试题第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

    Java为什么匿名内部类参数引用需要用final进行修饰?

    今天小编就为大家分享一篇关于Java为什么匿名内部类参数引用需要用final进行修饰?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    Java内部类:你真得了解方法内部类吗?

    java内部类,相信很多人都使用过内部类,新建线程使用的匿名内部类,但是有很多人对内部类的一些概念处于模糊阶段,比如为什么方法内部类引用方法参数,方法参数必须设置为final,所以本文系统得整理了一下内部类...

    java(1.8)字节码读例(匿名内部类)

    源代码 public class ThreadDemo { public static void main(String[] args) { ... final int j = i; new Thread(new Runnable() { @Override public void run() { System.out.println(线程 + j);

    java易混淆概念Anonymous Inner Class

    java易混淆的地方,final, finally, finalize的区别,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类

    java为什么匿名内部类的参数引用时final?final局部变量的生命周期

    在知乎上看到了一篇帖子 在这个问题下面大家已经吵得不可开交了,看了很多篇文章,被误导进了很多的坑,发现只有下面两篇文章是写的最好的,解释的很清楚,我把两篇文章简单的总结了一下: ...1.问题的引出 ...

    Java基础【final、权限、内部类、引用类型】

    第一章 final关键字1.1 概述1.2 使用方式修饰类修饰方法修饰变量第二章 权限修饰符2.1 概述2.2 不同权限的访问能力第三章 内部类3.1 概述什么是内部类成员内部类访问特点3.2 匿名内部类【重点】前提格式使用方式第四...

    Java中final关键字详解

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。 主要介绍:一.final关键字的基本...

    观看韩顺平学习整理java的笔记到异常

    匿名内部类的使用(重要!!!!!!!) 13 成员内部类的使用 13 静态内部类的使用 14 枚举的二种实现方式 14 自定义类实现枚举 14 使用 enum 关键字实现枚举注意事项 15 enum 用方法说明 15 enum 实现接口 15 注解的理解 16...

    Javaw基础课程笔记.zip

    Java 视频教程目录: day01、Java 语言发展史_JDK的安装_HelloWorld程序的编写_关键字_标识符_基本数据类型。 day02、Java 数据类型转换_...day11:Java final 关键字_内部类_成员内部类_局部内部类_匿名内部类。

    【05-面向对象(下)】

    •匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下: •new 父类构造器(实例列表) |实现接口) •{ • //匿名内部类的 类体部分 •} •匿名内部类不能是抽象类,匿名内部类不能定义...

    Java基础知识点.html

    Date类 自动拆箱和自动装箱 Arrays 类和接口的关系 内部类 成员内部类 局部内部类 匿名内部类 抽象类 接口 多态 封装 类和对象 方法 StringBuilder类 String类 static for循环 final 权限修饰符 跳转控制语句 while...

    java8集合源码-Java8:java8实践

    匿名内部类与 Lambda 不同 匿名内部类中的“this”指的是匿名内部类对象的 this,而在 lambda 中它指的是外部类 this。 lambda 中没有“this”。 Java 8 中的元空间在高层次上,它已被引入代替 perm gen。 与烫发...

    java程序员必知的

    第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?  可以继承其他类或完成其他接口,在swing编程中常用此方式。  第三,Static Nested Class ...

    MyBatis 3 _ SQL 语句构建器1

    1.匿名内部类风格 2.Builder/Fluent 风格 3.动态条件(参数需要使用 final 修饰,以便返回值中的匿名内部类使用)

    java内部学习笔记.docx

    3.16内部类 26 3.17匿名类 27 3.18二维数组和对象数组 28 3.19其他注意事项 28 Java SE核心I 30 4.1 Object类 30 4.2 String类 31 4.3 StringUtils类 33 4.4 StringBuilder类 33 4.5正则表达式 34 4.6 Date类 35 4.7...

    java面试笔试题大汇总+很全面.txt

     第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?   第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。 ...

Global site tag (gtag.js) - Google Analytics