`

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的或者实际上等效于final。这是因为匿名内部类可以异步执行,它们可能在局部变量的生命周期结束后仍然需要访问这些变量。 4. **单例模式中的应用** ...

    内部类知识总结3--匿名内部类

    同时,如果匿名内部类访问了外部类的非`final`局部变量,这些变量会被隐式地转换为`final`。 7. **内部类与内存管理** 内部类的对象会持有对外部类对象的引用,因此,只要内部类对象存在,外部类对象就不会被垃圾...

    Java4Android 35_内部类和匿名内部类

    - 匿名内部类不能包含静态成员(除了final static变量)。 - 匿名内部类不能有构造器,但可以通过初始化块来传递参数。 学习“Java4Android 35_内部类和匿名内部类”这个教程,开发者将掌握如何有效地利用内部类和...

    Java 匿名内部类

    虽然标题没有明确指出,但值得注意的是,匿名内部类也可以作为类的成员,不过在这种情况下,它通常与外部类有密切的关系,可能访问外部类的成员变量和方法,包括private的。 5. **构造器**: 匿名内部类可以有...

    java 内部类使用(内部匿名类)

    内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...

    匿名内部类核心重点知识讲解和经典例子讲解

    4. **匿名内部类与抽象类** - **继承抽象类**:匿名内部类也可以继承一个抽象类,并提供未实现的方法的实现。 5. **匿名内部类的应用场景** - **事件监听**:在Swing或Android开发中,常用于创建事件监听器。 - ...

    发两个匿名内部类使用的例子

    在Java编程语言中,匿名内部类是一种特殊的类,它没有名字,通常用于简化代码和实现特定功能。在标题“发两个匿名内部类使用的例子”中,我们将会探讨两种不同的场景,如何利用匿名内部类来解决问题。这篇博客文章的...

    内部类 匿名内部类 内部接口 对比说明

    本文将详细探讨内部类、匿名内部类以及内部接口的对比和使用。 首先,让我们了解一下内部类的基本概念。内部类定义在其他类的内部,编译后会生成两个独立的类文件。内部类能够自由地访问外部类的所有成员,包括私有...

    深入解析Java编程中final关键字的作用

    5. **final与匿名内部类**: 虽然匿名内部类不能被显式地继承,但它们并不是隐式final的。这意味着匿名内部类可以重写其外部类或接口定义的方法。 6. **final与反射**: 反射API中的`Modifier.isFinal()`方法可以...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    然而,不当使用Handler,尤其是结合匿名内部类或非静态内部类,可能导致内存泄漏和Native内存增加,这对应用性能和稳定性造成负面影响。 首先,我们要理解内存泄漏的概念。内存泄漏是指程序中已分配的内存没有被...

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

    总结来说,局部内部类和匿名内部类只能访问final或等效final的局部变量,这是为了保证代码的可读性和内存管理的正确性。通过使用final关键字,我们可以确保内部类所使用的变量在创建后不会被意外地修改,从而避免了...

    Java基础权限控制与final,内部类

    内部类主要分为四种类型:成员内部类、静态内部类、局部内部类和匿名内部类。内部类可以访问外部类的成员,包括私有成员,这增加了类之间通信的便利性。 成员内部类是最常见的内部类,它可以无限制地访问外部类的...

    关于匿名内部类的资料

    - 局部内部类的所有限制也适用于匿名内部类,这意味着它们不能是顶级类,也不能访问外部类的非 `final` 局部变量。 3. **语法示例**: 在Java中,匿名内部类的语法可能会显得有些奇特。例如,以下代码展示了如何...

    JAVA_匿名内部类

    匿名内部类可以访问其所在的作用域内的局部变量,但必须注意,对于非final的局部变量,匿名内部类只能引用它们的值,而不是变量本身。这是因为当匿名内部类被创建时,它可能在外部作用域之后仍然存活,所以需要这些...

    MapReduce,泛型,匿名内部类,Runnable和Callable

    匿名内部类可以直接访问外部类的成员,包括final变量和局部变量。在多线程编程中,我们常常使用匿名内部类来创建Thread或Runnable对象,简化代码的同时提高了可读性。 `Runnable`和`Callable`接口都是用于多线程...

    非常精简的匿名内部类详解.docx

    下面我们将深入探讨匿名内部类的定义、使用场景以及其与普通类的区别。 首先,匿名内部类可以分为两种类型:继承类的匿名内部类和实现接口的匿名内部类。在提供的内容中,主要讨论的是实现接口的匿名内部类。当需要...

    内部类分类及应用

    在使用匿名内部类时,要记住以下几个原则:匿名内部类不能有构造方法、匿名内部类不能是public、protected、private、static、只能创建匿名内部类的一个实例、匿名内部类不能定义任何静态成员、静态方法、一个匿名...

    【IT十八掌徐培成】Java基础第06天-04.匿名内部类1.zip

    不过,需要注意的是,匿名内部类只能继承非final的本地类或者静态嵌套类,因为Java的内存管理机制限制了非静态内部类对它们的外部类有隐含的引用,这可能导致内存泄漏问题。 在课程中,徐培成老师可能会通过示例...

    使用内部和匿名类优化Java代码

    因此,应谨慎选择何时使用内部类和匿名类,确保它们的使用符合设计原则和代码规范,同时避免常见的错误,如未正确处理内部类与外部类的引用关系,以及在不必要的情况下使用匿名类。通过理解这些特性的工作原理和适用...

    Java匿名内部类的写法示例

    - 对于局部变量,匿名内部类只能访问final或实际上final的变量。 - 匿名内部类不能声明构造器。 总之,Java匿名内部类提供了代码的简洁性和灵活性,特别适合处理临时性或一次性的需求。熟练掌握匿名内部类的使用,...

Global site tag (gtag.js) - Google Analytics