0

0

在Java里final类如何防止继承_Java类安全设计解析

P粉602998670

P粉602998670

发布时间:2026-01-16 14:59:46

|

342人浏览过

|

来源于php中文网

原创

final修饰类是最硬的继承拦截手段,编译期直接拒绝extends,jvm字节码层面不支持继承,ide编辑时即标红,反射和字节码生成亦无法绕过。

在java里final类如何防止继承_java类安全设计解析

final 修饰类,Java 编译器会直接拒绝任何 extends 尝试,这是最硬的继承拦截手段。

final 类声明后子类编译失败是确定行为

只要类被声明为 final,JVM 字节码层面就不会生成可被继承的类结构。哪怕子类只写个空壳,javac 也会报错:

error: cannot inherit from final class
class MySubClass extends String { }

这不是运行时检查,而是编译期强制约束。所有主流 IDE(IntelliJ、Eclipse)都会在编辑阶段标红提示。

  • final 修饰的是类本身,和其中字段/方法是否 final 无关
  • 匿名内部类不能继承 final 类,Lambda 表达式也不能基于它构造函数式实例
  • 反射也无法绕过:调用 Class.forName() 加载没问题,但 Unsafe.defineClass() 或字节码生成库(如 ASM)若试图构造其子类,会在 verify 阶段失败

哪些类适合加 final?看是否满足“不可变契约”

不是所有工具类都要 final,关键看设计意图是否要求“行为封闭”。典型场景包括:

立即学习Java免费学习笔记(深入)”;

AI Note
AI Note

AI Note 助手,像贴心女仆一样助力你的笔记!智能总结内容,精确划重点,提供专业建议,让学习与工作更高效。让你的笔记更清晰、有条理,知识尽在眼前!

下载
  • 值对象:如 StringLocalDateTime —— 继承会破坏不可变性假设
  • 安全敏感类:如 java.security.MessageDigest 的具体实现(如 SHA256),防止被恶意子类篡改摘要逻辑
  • 框架核心契约类:如 Spring 的 BeanFactory 是接口,但它的默认实现 DefaultListableBeanFactory 并非 final;而像 org.springframework.util.Assert 这类纯静态工具类加 final 是为防误继承(它甚至没构造器)

反例:ArrayList 不是 final,因为设计上允许用户扩展(如重写 add() 做日志);强行加 final 会破坏开闭原则。

final 类里还能用 protected 吗?能,但没意义

可以声明 protected 方法或字段,但编译器不会报错,因为语法合法。问题在于:没人能继承它,protected 的访问权限实际降级为包内可见(package-private)。

更隐蔽的问题是——如果你后期想移除 final,又忘了把 protected 改成 private,就可能意外暴露内部细节。所以建议:

  • 如果类已定为 final,所有成员优先用 private
  • 除非你明确需要同包其他类调用,才用 package-private(不写修饰符)
  • 避免写 protected,它在这里只是个“幻觉权限”

真正难的是判断“该不该 final”,而不是怎么写。很多人加 final 是怕别人乱继承,却忽略了自己写的类根本没提供可被合理重写的钩子(比如全是 private 方法),这时候 final 只是心理安慰。安全设计的核心,是厘清类的职责边界,而不是堆砌关键字。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

155

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

eclipse教程
eclipse教程

php中文网为大家带来eclipse教程合集,eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。php中文网还为大家带来eclipse的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

194

2023.06.14

eclipse怎么设置中文
eclipse怎么设置中文

eclipse设置中文的方法:除了设置界面为中文外,你还可以为Eclipse添加中文插件,以便更好地支持中文编程。例如,你可以安装EBNF插件来支持中文变量名,或安装Chinese Helper来提供中文帮助文档。本专题为大家提供eclipse设置中文相关的各种文章、以及下载和课程。

805

2023.07.24

c语言编程软件有哪些
c语言编程软件有哪些

c语言编程软件有GCC、Clang、Microsoft Visual Studio、Eclipse、NetBeans、Dev-C++、Code::Blocks、KDevelop、Sublime Text和Atom。更多关于c语言编程软件的问题详情请看本专题的文章。php中文网欢迎大家前来学习。

623

2023.11.02

Eclipse版本号有哪些区别
Eclipse版本号有哪些区别

区别:1、Eclipse 3.x系列:Eclipse的早期版本,包括3.0、3.1、3.2等;2、Eclipse 4.x系列:Eclipse的最新版本,包括4.0、4.1、4.2等;3、Eclipse IDE for Java Developers等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2024.02.23

eclipse和idea有什么区别
eclipse和idea有什么区别

eclipse和idea的区别:1、平台支持;2、内存占用;3、插件系统;4、智能代码提示;5、界面设计;6、调试功能;7、学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

152

2024.02.23

eclipse设置中文全教程
eclipse设置中文全教程

本专题整合了eclipse设置中文相关教程,阅读专题下面的文章了解更多详细操作。

116

2025.10.10

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号