惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
O
OpenAI News
WordPress大学
WordPress大学
P
Proofpoint News Feed
J
Java Code Geeks
G
Google Developers Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Register - Security
The Register - Security
Engineering at Meta
Engineering at Meta
H
Help Net Security
人人都是产品经理
人人都是产品经理
Vercel News
Vercel News
N
Netflix TechBlog - Medium
F
Full Disclosure
U
Unit 42
Latest news
Latest news
N
News and Events Feed by Topic
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
InfoQ
L
LINUX DO - 最新话题
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
K
Kaspersky official blog
Google Online Security Blog
Google Online Security Blog
小众软件
小众软件
I
Intezer
V
V2EX
S
SegmentFault 最新的问题
C
CERT Recently Published Vulnerability Notes
阮一峰的网络日志
阮一峰的网络日志
Security Archives - TechRepublic
Security Archives - TechRepublic
Recent Announcements
Recent Announcements
C
Check Point Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Recorded Future
Recorded Future
博客园 - Franky
Project Zero
Project Zero
S
Securelist
Attack and Defense Labs
Attack and Defense Labs
Spread Privacy
Spread Privacy
The Hacker News
The Hacker News
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
aimingoo的专栏
aimingoo的专栏
博客园 - 叶小钗
NISL@THU
NISL@THU
云风的 BLOG
云风的 BLOG
S
Secure Thoughts
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed

码云笔记

Pinia v4 发布:Vue 状态管理进入新时代 Linux LVM:故障排查与数据恢复指南 Java中wait()与sleep()方法的不同点是什么? Bonsai27B 重磅落地!27B 大模型实现手机本地运行 ES2026 第 17 版新增的 5 个新特性 高德重磅上线 ABot‑World Studio,消费级显卡就能搭建专属 3D 虚拟世界 怎么修改Ollama及其模型的默认路径?Ollama路径修改、迁移与重启的操作教程 iOS27 公开测试版正式上线!AI Siri 与液态玻璃成最大看点 Yuku正式发布!比 Vite+ 快 5.4 倍的前端工具链 Linux lsof 命令详解:进程与文件监控实战 Claude Code CLI命令手册 代码审查重构Bug修复场景化工作流 OpenClaw中连接并使用本地Ollama模型的操作教程 GPT-5.6 今天正式上线:OpenAI 掏出”太阳系”全家桶,Sol / Terra / Luna 齐发,打的却是一张”效率牌” Nacos MySQL持久化部署完整教程 GPT-5.6系列正式上线:OpenAI以效能与性价比重塑AI行业竞争格局 Java中序列化与反序列化的概念是什么? 如何在HTML中实现字体颜色根据背景自动变化? JDK动态代理与CGLIB动态代理的区别是什么? OpenClaw数据加密敏感信息保护的完整教程 砸超亿美元算力!亚马逊秘密启动Moonraker项目,Alexa迎来颠覆性升级 PHP 最轻量、结构化 .docx 到 Markdown 转换器 Elephant TypeScript 7.0 正式发布 蚂蚁灵波开源全球首款 MoE 具身视频大模型 LingBot-Video,为机器人世界模型搭建新底座 SpaceX AI联合Cursor推出Grok 4.5 搅动专业AI赛道格局 英伟达Vera CPU落地商用,改写AI代理时代算力竞争规则 什么是端点检测与响应(EDR)以及它的工作原理介绍 Anime.js 已经 10 岁了!作者查出脑瘤,V5 将开始收费! 星链开启全面升级!SpaceX申请十万颗卫星,构建AI时代全球天基基建 PHP 通用表达式语言 CEL-PHP 2.0.0 正式发布! WordPress 7.0 下载,支持AI建站 Docker Desktop(windows)版本下载 详解 Linux 端口监听检查工具:ss、netstat、lsof 京东 JoyAI 上线 UGC 数字人功能,普通人一键打造专属虚拟分身 Java中Integer缓存池的作用是什么? 应对劳动力短缺 日本加码布局AI机器人产业,2040年拟千万台机器人落地各行各业 Java中深拷贝与浅拷贝的区别是什么? Claude旗舰模型收费规则大变:订阅权益取消,转为按量计费 MySQL中的分布式架构和复制策略 如何在 MySQL 中处理 BLOB 和 CLOB 数据类型? 如何在 MySQL 中处理和优化长时间运行的查询? git提交信息分别用什么icon好? Composer安装与配置教程 35岁华为员工偷偷面试,被面试官嘲讽:你是被淘汰的吧?他的回怼让面试官当场闭嘴 谷歌Nano Banana 2 Lite正式上线:4秒极速出图,大幅降低AI生图成本 锐捷交换机运维配置完全参考手册 Vue 3.5:Effect Scope 与响应式污染隔离机制 IS-IS协议基本概念、工作原理与扩展应用 美团LongCat-2.0重磅开源!国产万亿参数大模型解锁超长上下文新能力 LangChain4j 和 LangGraph4j 区别是什么?哪个更好? Claude Code 的聊天和配置可以一键搬进 Codex 了 码云笔记详解Markdown格式兼容性、图片显示失效与同步冲突解决 python实现自动爬取某论坛帖子并导出到Word文档的实战教程 高德低调内测 AI 零代码工具“袋马”,切入小微商家轻量化应用开发赛道 一文看懂OSPF:基础概念、工作原理和应用场景 PHP (Yii2) 接入企业级 SSO 单点登录实战教程 Google终于支持修改Gmail邮箱了?实测告诉你哪些能改,哪些不能改!(附详细教程+FAQ) UCloud 4.6 元 / 月服务器是真的吗? 2026 云服务器完整选购攻略 Webiny:无服务器应用程序框架 Fyrox:现代化的 Rust 游戏引擎 千问发布全球首个原生语言世界模型Qwen-AgentWorld,AI智能体迈入全环境实操新时代 火山引擎上新豆包音频生成模型1.0,AI音频生成实现一键全流程创作 使用Claude Code经常遇到的10个问题 如何批量清理wordpress所有文章和标签,保留设置,保留分类? 谷歌 NotebookLM 内测文献综述矩阵工具,Gemini3.5 赋能 AI 学术结构化研究 京东开源JoyAI-VL-Interaction模型 解锁AI实时视频视觉交互新形态 破解中小商家海报设计难题!MeiGen-AI开源闭环AI设计方案落地 详解Bash set 命令:set -e、set -x 和 set -u 完全指南 Node Plus ?比 pnpm 快 24 倍! Plan-Execute-Replan 和 ReAct 的区别是什么? Anthropic最新报告揭秘:AI编程人机协作成开发者主流工作模式 详解PostgreSQL 18 逻辑复制冲突检测与解决方法 JDK动态代理与CGLIB动态代理的区别是什么? 详解 Linux 中 localhost、127.0.0.1 与 Loopback(回环地址) OpenAI Codex新手入门教程 安装配置AGENTS.md与MCP全流程详解 程序员必备AGENTS.md配置指南 规避AI编码修改乱象 使用 Codex 必装的 12 个插件,你值得拥有! macOS AI CLI工具安装与避坑指南 OpenClaw Gemini Claude报错全套解决方案 智谱AI正式开源GLM-5. 2 模型:主打1M无损上下文与长程代码任务 小米 MiMo Claw 正式版上线 轻量化 Agent 打通金山办公生态 如何定义 Vue 的动态路由?如何获取传过来的动态参数? 记录Claude Code Router 接入过程遇到问题及解决方法 千问AI眼镜凭硬核实力领跑2026智能穿戴赛道 程序员特有的习惯你占了几条! 郝景芳新作半数内容由AI创作,文坛郝景芳AI写作争议再起 使用 iftop、nload、bmon、vnstat 监控 Linux 网络带宽 现代富文本编辑器为什么最终都会抛弃 DOM? Vue 的 v-cloak 和 v-pre 指令有什么作用? 去哪里买抖音号?抖音小号在线购买-抖音小号出售批发 实名闲鱼小号出售|闲鱼账号批发|咸鱼发布账号|出售闲鱼发布账号 zfb号购买-支付宝小号购买-实名支付宝购买号-企业支付宝购买-支付宝小号批发 个人支付宝实名账号出售|v2/v3支付宝账号出售|实名支付宝小号购买 闲鱼账号哪里有卖-闲鱼实名账号购买的途径 Java注解的实现原理是什么? Agentation MemPalace 《置身钉内》之好词好句好段摘抄 AI有声书革命!万象有声全自动生产线,7元/万字颠覆网文有声化行业 详解CentOS 7跨版本迁移Rocky Linux9 生产环境安全升级教程 Java中序列化与反序列化的含义是什么? 18. Python 标准库之 Json 模块
Java中final、finally和finalize的区别是什么?
艾米利亚 普通 · 2026-07-14 · via 码云笔记

AI 概述

文章讲解Java里final、finally、finalize三者用法。final修饰类禁止继承、方法不能重写、变量赋值后不可更改,编译器借此完成常量折叠、方法内联优化;finally是异常模块,无论是否报错都会执行,多用于释放资源,现代Java优先选择try‑with‑resources;finalize在GC回收对象前执行清理,但执行时机不确定现已被废弃。最后总结三者定位,并给出后端日常开发的编写建议。

目录

文章目录隐藏

  1. 1. final 的用法与原理
  2. 2. finally 的用法与原理
  3. 3. finalize 的用法与原理
  4. 知识拓展
  5. 总结
  6. 相关阅读

Java 中 final、finally 和 finalize 的区别是什么?

1.1 final 的作用

  • final 类:如果一个类被 final 修饰,它就不能被继承。final 类常用于实现不可变的类,或者出于安全性和设计目的不允许子类化的类。例如,String 类是 final,这确保了它的不可变性。
  • final 方法:如果一个方法被 final 修饰,它就不能被子类重写。常见的如 Object 类的 equals() 和 hashCode() 方法。
  • final 变量:如果一个变量被 final 修饰,表示它的值一旦被赋值后,就不可再改变,常用于定义常量。对于引用类型的变量,final 保证的是引用不可改变,但对象的内容仍然可以修改。

1.2 final 的代码示例

// final 类
final class MyClass {
    public void display() {
        System.out.println("MyClass display method");
    }
}

// final 方法
class Parent {
    public final void show() {
        System.out.println("Parent show method");
    }
}

// final 变量
class Example {
    final int MAX_VALUE = 100;
    
    public void changeValue() {
        // MAX_VALUE = 200; // 编译错误,常量不可修改
    }
}

解析

  • MyClass 类被 final 修饰,意味着它不能被继承。
  • show 方法被 final 修饰,子类不能重写该方法。
  • MAX_VALUE 变量是常量,不能被重新赋值。

2. finally 的用法与原理

2.1 finally 语句块的作用

finally 语句块是 Java 异常处理的一部分,确保无论是否发生异常,finally 中的代码都会被执行。finally 语句块通常用于进行一些必须执行的清理操作,如释放资源(例如:关闭文件、关闭数据库连接等)。

2.2 finally 的工作机制

无论 try 块是否抛出异常,finally 语句块中的代码总是会执行。finally 在 异常处理 中是非常重要的一部分,它保证了资源的正确释放

  • 如果在 try 或 catch 中执行了 return 语句,finally 仍然会被执行。
  • finally 中的代码执行顺序在 try 和 catch 语句之后。

2.3 finally 的代码示例

public class FinallyExample {
    public static void main(String[] args) {
        try {
            System.out.println("执行 try 块");
            int result = 10 / 0;  // 会抛出异常
        } catch (Exception e) {
            System.out.println("捕获异常");
        } finally {
            System.out.println("执行 finally 块");
        }
    }
}

输出结果

执行 try 块
捕获异常
执行 finally 块

解析

无论 try 中是否发生异常,finally 块的内容都会被执行。这保证了在异常发生时,程序仍能正确清理资源。

2.4 finally 的应用场景

finally 最常用的场景是 资源释放,例如文件操作、数据库连接、网络连接等。

public class ResourceManagement {
    public static void manageResource() {
        try {
            // 模拟文件读取操作
            System.out.println("打开文件...");
        } finally {
            // 确保文件被关闭
            System.out.println("关闭文件...");
        }
    }
}

3. finalize 的用法与原理

3.1 finalize 的作用

finalize() 方法是 Object 类中的一个方法,通常在对象被垃圾回收之前调用。它提供了一个钩子方法,在对象被回收时可以做一些清理工作,比如释放资源或关闭文件句柄。

然而,finalize() 并不是一个推荐的清理方法。首先,垃圾回收的时机无法确定,因此 finalize() 不一定会被调用,且它可能导致资源释放不及时。现代的 Java 开发中,更多地依赖于 try-with-resources 和显式的资源释放来管理资源。

3.2 finalize 的代码示例

class MyClass {
    @Override
    protected void finalize() throws Throwable {
        try {
            // 资源释放代码
            System.out.println("资源被释放");
        } finally {
            super.finalize(); // 保证父类的 finalize 方法被调用
        }
    }
}

public class FinalizeExample {
    public static void main(String[] args) throws Exception {
        MyClass obj = new MyClass();
        obj = null; // 将对象置为 null,准备回收
        System.gc(); // 强制垃圾回收
    }
}

解析

System.gc() 调用不会立即触发垃圾回收,因此 finalize() 的调用时机是不可预测的。通常不依赖 finalize() 来管理资源,而是使用显式的资源管理方式。

知识拓展

1. final 和性能优化

final 对性能的影响

  • final 变量:对于 final 变量,Java 编译器可以进行优化。对于常量,编译器可以将其 常量折叠,减少了计算的复杂度,提升了性能。
  • final 方法final 方法由于不能被重写,因此编译器能够进行 方法内联 优化,即将方法的调用直接替换为方法体的代码,减少了方法调用的开销。
  • final 类:由于 final 类不能被继承,JVM 在加载类时可以进行优化,减少了继承带来的开销。

性能示例:

final int CONSTANT = 100;

编译器会将 CONSTANT 直接替换为常量值,避免每次引用时都进行计算。

2. finally 与资源管理的关系

虽然 finally 块常用于资源管理,但在现代 Java 中,更推荐使用 try-with-resources 语句,它自动管理资源的关闭,而不需要显式的 finally

try-with-resources 示例

import java.io.*;

public class TryWithResourcesExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("file.txt")) {
            // 使用资源
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 不需要显式调用 finally 来关闭资源
    }
}

解析

try-with-resources 自动关闭实现了 AutoCloseable 接口的资源,这比显式的 finally 更加简洁和安全。

3. finalize 的替代方案:显式资源释放

finalize() 方法的调用时机不可控,推荐使用显式的资源释放策略,如 try-with-resources 或手动调用 close() 方法。

示例:显式资源释放

public class ResourceManagement {
    public void releaseResource() {
        try {
            // 资源使用逻辑
        } finally {
            // 确保资源释放
            closeResource();
        }
    }

    public void closeResource() {
        System.out.println("资源被显式释放");
    }
}

总结

  1. final:用于修饰类、方法和变量,表示 不可修改
    • :不能被继承。
    • 方法:不能被重写。
    • 变量:常量,值不可变。
  2. finally:用于异常处理中的代码块,确保无论是否发生异常,都会执行其中的代码。通常用于 资源清理(如关闭文件、数据库连接)。
  3. finalize:用于对象被垃圾回收前的资源清理,但由于调用时机不可控,已经不推荐使用。
  4. 扩展建议
    • 性能优化final 可以提高性能,尤其是在常量和方法调用上。
    • 资源管理:尽量使用 try-with-resources 来自动关闭资源,避免使用 finalize

相关阅读

Java Object finalize() 方法

finally 中的代码一定会执行吗?

以上关于Java中final、finally和finalize的区别是什么?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

22

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Java中final、finally和finalize的区别是什么?