Java中的final/finally/finalize与对象4种引用全解析

 更新时间:2026年07月07日 09:56:01   作者:Seal^_^  
final/finally/finalize 与四种引用是Java基础、面试、JVM内存管理的核心知识点,理解它们能大幅提升代码健壮性与面试通过率,本文将用清晰定义、核心用法、代码示例、流程图、对比总结全方位讲解,感兴趣的朋友一起看看吧

前言

在Java面试与核心基础知识点中,final、finally、finalize 的区别与对象四种引用(强软弱虚) 是高频必考题,同时也是理解Java内存管理、异常处理、ThreadLocal原理的关键内容。

本文将用清晰定义、核心用法、代码示例、流程图、对比总结全方位讲解,帮你一次性吃透所有考点,轻松应对面试与开发!

一、核心区分:final、finally、finalize 三者详解

1.1 final(关键字:表示不可变)

final 是Java关键字,用于限制不可变、不可继承、不可重写

  1. 修饰类:类不能被继承(如String、Integer)
  2. 修饰方法:方法不能被子类重写
  3. 修饰变量:变量变成常量,只能赋值一次
// 修饰类
final class Demo{}
// 修饰方法
public final void test(){}
// 修饰变量
final int a = 10;

1.2 finally(异常处理:必须执行)

finally 是 try-catch 语句块,无论是否异常都会执行

核心用途:

  • 关闭IO流
  • 关闭数据库连接
  • 释放锁资源
try{
    // 业务代码
}catch(Exception e){
    // 异常处理
}finally{
    // 必须执行:关闭资源
}

1.3 finalize(Object方法:GC回收前调用)

finalize 是Object类的方法,由垃圾回收器GC调用

作用:对象被回收前做资源释放,已被废弃,不推荐使用

@Override
protected void finalize() throws Throwable {
    // 回收前操作
}

1.4 三者核心对比表

关键字类型作用使用场景
final关键字不可变、不可继承、不可重写定义常量、工具类
finally代码块异常处理必须执行关闭资源
finalize方法GC回收前调用已废弃

二、Java对象的四种引用(强、软、弱、虚)

2.1 强引用(Strong Reference)永不回收

最常用,只要引用存在,GC绝不回收对象

Object obj = new Object(); // 强引用

特点:

  • 内存不足也不会回收
  • JVM宁愿抛出OOM也不回收强引用对象

2.2 软引用(Soft Reference)内存不足才回收

内存溢出OOM前才会被回收,适合做缓存

Object obj = new Object();
SoftReference<Object> sf = new SoftReference<>(obj);
obj = null;
sf.get(); // 内存足够时返回对象,不足时返回null

使用场景:

  • 图片缓存
  • 网页缓存
  • 不需要常驻内存的数据

2.3 弱引用(Weak Reference)下次GC必回收

只要GC触发,就会被回收,生命周期短

Object obj = new Object();
WeakReference<Object> wf = new WeakReference<>(obj);
obj = null;
wf.get(); // GC前有值,GC后为null

核心重点:ThreadLocal底层key就是弱引用!

static class Entry extends WeakReference<ThreadLocal<?>> {
    Object value;
    Entry(ThreadLocal<?> k, Object v) {
        super(k);
        value = v;
    }
}

2.4 虚引用(Phantom Reference)随时回收,等于无

get()永远返回null,仅用于监听对象回收

必须配合引用队列ReferenceQueue使用。

ReferenceQueue queue = new ReferenceQueue();
PhantomReference<Object> pf = new PhantomReference<>(obj, queue);

作用:

  • 监听对象被GC回收的时机
  • 管理堆外内存

三、四种引用回收时机流程图

四、高频面试题标准答案(直接背诵)

4.1 final、finally、finalize 区别?

  1. final 是关键字,用于不可变;
  2. finally 用于异常处理,必须执行;
  3. finalize 是Object方法,GC回收前调用。

4.2 四种引用有哪些?

强引用、软引用、弱引用、虚引用。

4.3 ThreadLocal 为什么使用弱引用?

为了避免内存泄漏,ThreadLocalMap的key使用弱引用,当ThreadLocal对象变为null时,key会被GC自动回收。

结束语

final/finally/finalize 与四种引用是Java基础、面试、JVM内存管理的核心知识点,理解它们能大幅提升代码健壮性与面试通过率。建议收藏本文,随时复习!

到此这篇关于Java中的final/finally/finalize与对象4种引用全解析的文章就介绍到这了,更多相关java final、finally、finalize与四种引用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 中 System.out.println()和System.out.write()的区别

    java 中 System.out.println()和System.out.write()的区别

    这篇文章主要介绍了 java 中 System.out.println()和System.out.write()的区别.的相关资料,需要的朋友可以参考下
    2017-04-04
  • springboot 默认静态路径实例解析

    springboot 默认静态路径实例解析

    这篇文章主要介绍了springboot 默认静态路径实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java练习之潜艇小游戏的实现

    Java练习之潜艇小游戏的实现

    这篇文章主要和大家分享一个Java小练习——利用Java编写一个潜艇小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-03-03
  • Java通过apache poi生成excel实例代码

    Java通过apache poi生成excel实例代码

    本篇文章主要介绍了Java通过apache poi生成excel实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • SpringBoot整合定时任务@Scheduled与Quartz的方案

    SpringBoot整合定时任务@Scheduled与Quartz的方案

    这篇文章详细介绍了SpringBoot内置的@Scheduled定时任务和企业级调度库Quartz的使用场景与配置方法,涵盖固定间隔与Cron表达式设置,并提供实际开发中的常见问题与解决方案,适合前后端开发人员参考,需要的朋友可以参考下
    2026-07-07
  • BeanUtils.copyProperties复制属性失败的原因及解决方案

    BeanUtils.copyProperties复制属性失败的原因及解决方案

    这篇文章主要介绍了BeanUtils.copyProperties复制属性失败的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot使用MyBatis实现数据的CRUD

    SpringBoot使用MyBatis实现数据的CRUD

    MyBatis是一个轻量级的对象关系映射(Object-Relational Mapping,ORM)框架,它允许开发者通过编写SQL动态查询数据库,而无需显式地操作JDBC,对于增删改查操作,MyBatis提供了一种基于XML或注解的方式来进行,本文介绍了SpringBoot使用MyBatis实现数据的CRUD
    2024-11-11
  • 详解Sentinel流量控制限流框架的原理与使用

    详解Sentinel流量控制限流框架的原理与使用

    Sentinel 是一个高可用、高扩展、高稳定性的开源流量控制和熔断降级框架,可以在分布式系统中实现实时的流量控制,下面就来和大家聊聊是具体如何操作的吧
    2023-05-05
  • SpringMVC中redirect重定向(带参数)的3种方式

    SpringMVC中redirect重定向(带参数)的3种方式

    Spring MVC中做form表单功能提交时,防止用户客户端后退或者刷新时重复提交问题,需要在服务端进行重定向跳转,本文主要介绍了SpringMVC中redirect重定向(带参数)的3种方式,感兴趣的可以了解一下
    2024-07-07
  • Spring 中@Validated 分组校验的使用解析

    Spring 中@Validated 分组校验的使用解析

    这篇文章主要介绍了Spring 中@Validated 分组校验的使用解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10

最新评论