Java核心考点:final/finally/finalize与对象4种引用全解析
Java核心考点:final/finally/finalize与对象4种引用全解析
- 前言
- 一、核心区分:final、finally、finalize 三者详解
- 1.1 final(关键字:表示不可变)
- 1.2 finally(异常处理:必须执行)
- 1.3 finalize(Object方法:GC回收前调用)
- 1.4 三者核心对比表
- 二、Java对象的四种引用(强、软、弱、虚)
- 2.1 强引用(Strong Reference)永不回收
- 2.2 软引用(Soft Reference)内存不足才回收
- 2.3 弱引用(Weak Reference)下次GC必回收
- 2.4 虚引用(Phantom Reference)随时回收,等于无
- 三、四种引用回收时机流程图
- 四、高频面试题标准答案(直接背诵)
- 4.1 final、finally、finalize 区别?
- 4.2 四种引用有哪些?
- 4.3 ThreadLocal 为什么使用弱引用?
- 结束语
🌺The Begin🌺点点关注,收藏不迷路🌺 ⬇ ⬇ 底部 ⬇ ⬇ |
前言
在Java面试与核心基础知识点中,final、finally、finalize的区别与对象四种引用(强软弱虚)是高频必考题,同时也是理解Java内存管理、异常处理、ThreadLocal原理的关键内容。
本文将用清晰定义、核心用法、代码示例、流程图、对比总结全方位讲解,帮你一次性吃透所有考点,轻松应对面试与开发!
一、核心区分:final、finally、finalize 三者详解
1.1 final(关键字:表示不可变)
final 是Java关键字,用于限制不可变、不可继承、不可重写
- 修饰类:类不能被继承(如String、Integer)
- 修饰方法:方法不能被子类重写
- 修饰变量:变量变成常量,只能赋值一次
// 修饰类finalclassDemo{}// 修饰方法publicfinalvoidtest(){}// 修饰变量finalinta=10;1.2 finally(异常处理:必须执行)
finally 是 try-catch 语句块,无论是否异常都会执行
核心用途:
- 关闭IO流
- 关闭数据库连接
- 释放锁资源
try{// 业务代码}catch(Exceptione){// 异常处理}finally{// 必须执行:关闭资源}1.3 finalize(Object方法:GC回收前调用)
finalize 是Object类的方法,由垃圾回收器GC调用
作用:对象被回收前做资源释放,已被废弃,不推荐使用。
@Overrideprotectedvoidfinalize()throwsThrowable{// 回收前操作}1.4 三者核心对比表
| 关键字 | 类型 | 作用 | 使用场景 |
|---|---|---|---|
| final | 关键字 | 不可变、不可继承、不可重写 | 定义常量、工具类 |
| finally | 代码块 | 异常处理必须执行 | 关闭资源 |
| finalize | 方法 | GC回收前调用 | 已废弃 |
二、Java对象的四种引用(强、软、弱、虚)
2.1 强引用(Strong Reference)永不回收
最常用,只要引用存在,GC绝不回收对象
Objectobj=newObject();// 强引用特点:
- 内存不足也不会回收
- JVM宁愿抛出OOM也不回收强引用对象
2.2 软引用(Soft Reference)内存不足才回收
内存溢出OOM前才会被回收,适合做缓存
Objectobj=newObject();SoftReference<Object>sf=newSoftReference<>(obj);obj=null;sf.get();// 内存足够时返回对象,不足时返回null使用场景:
- 图片缓存
- 网页缓存
- 不需要常驻内存的数据
2.3 弱引用(Weak Reference)下次GC必回收
只要GC触发,就会被回收,生命周期短
Objectobj=newObject();WeakReference<Object>wf=newWeakReference<>(obj);obj=null;wf.get();// GC前有值,GC后为null核心重点:ThreadLocal底层key就是弱引用!
staticclassEntryextendsWeakReference<ThreadLocal<?>>{Objectvalue;Entry(ThreadLocal<?>k,Objectv){super(k);value=v;}}2.4 虚引用(Phantom Reference)随时回收,等于无
get()永远返回null,仅用于监听对象回收
必须配合引用队列ReferenceQueue使用。
ReferenceQueuequeue=newReferenceQueue();PhantomReference<Object>pf=newPhantomReference<>(obj,queue);作用:
- 监听对象被GC回收的时机
- 管理堆外内存
三、四种引用回收时机流程图
四、高频面试题标准答案(直接背诵)
4.1 final、finally、finalize 区别?
- final是关键字,用于不可变;
- finally用于异常处理,必须执行;
- finalize是Object方法,GC回收前调用。
4.2 四种引用有哪些?
强引用、软引用、弱引用、虚引用。
4.3 ThreadLocal 为什么使用弱引用?
为了避免内存泄漏,ThreadLocalMap的key使用弱引用,当ThreadLocal对象变为null时,key会被GC自动回收。
结束语
final/finally/finalize 与四种引用是Java基础、面试、JVM内存管理的核心知识点,理解它们能大幅提升代码健壮性与面试通过率。建议收藏本文,随时复习!
🌺The End🌺点点关注,收藏不迷路🌺 ⬆ ⬆ 顶部 ⬆ ⬆ |
