0

0

final关键字的三种用法_修饰类、方法与变量的最终态

P粉602998670

P粉602998670

发布时间:2026-02-21 15:49:03

|

713人浏览过

|

来源于php中文网

原创

final修饰类禁止继承,但抽象类不可用final;修饰方法禁止重写但允许重载;修饰变量仅保证引用不变,对象状态仍可变;仅static final基本类型或字符串且编译期确定才内联。

final关键字的三种用法_修饰类、方法与变量的最终态

final 修饰类:禁止继承,但要注意抽象类不能被 final 修饰

当你把一个类声明为 final,JVM 就不允许任何类去继承它。这常用于工具类(比如 java.lang.String)或安全敏感的类,防止子类篡改行为。

  • 常见错误:给 abstract 类加 final —— 编译直接报错 Illegal combination of modifiers: 'abstract' and 'final',因为抽象类本意就是被继承的
  • 使用场景:写完一个稳定、无扩展需求的工具类(如 StringUtils),又担心别人误继承导致逻辑混乱,就加 final
  • 性能影响几乎为零,纯编译期约束;但会降低框架集成灵活性(比如 Spring AOP 的 CGLIB 代理就无法对 final 类生效)

final 修饰方法:锁定实现,但不影响重载

final 方法不能被子类重写,但可以被重载(overload)。它和 @Override 是反向关系:一个说“你别动我”,一个说“我正覆盖你”。

  • 常见错误:以为 final 方法能阻止反射调用 —— 实际上 AccessibleObject.setAccessible(true) 依然能绕过访问控制(除非启用了安全管理器)
  • 使用场景:父类中定义了关键流程骨架(比如模板方法模式里的钩子方法),但某个步骤逻辑绝对不可变,就用 final 锁住
  • 注意:private 方法隐式是 final 的,再加 final 关键字虽不报错,但属于冗余,IDE 通常会警告

final 修饰变量:只赋值一次,但“不变”仅限引用地址

final 变量必须在声明时、构造器中或初始化块里完成赋值,之后不能再指向新对象。但它指向的对象内部状态仍可变 —— 这点最容易误解。

千问
千问

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

下载
  • 常见错误:写 final List<string> list = new ArrayList(); list.add("a");</string> 后以为“list 不可变”,其实只是不能 list = new ArrayList();,但 add/clear 都合法
  • 使用场景:配置项、常量、依赖注入后的不可变引用(比如 Spring 中 @Autowired private final Service service;
  • 参数差异:final 形参只是告诉调用方“我在方法内不会重新赋值这个参数变量”,不影响实参本身,也不影响传入对象的状态
  • 如果真要不可变容器,请用 Collections.unmodifiableList()ImmutableList.of(),而不是只靠 final

final 和编译期常量:只有 static final 基本类型/字符串才可能内联

只有同时满足 static + final + 基本类型或 String + 编译期可确定值,才会被编译器当作“编译期常量”,在调用处直接替换为字面量。

  • 常见错误:写 static final int TIMEOUT = System.currentTimeMillis() > 0 ? 5000 : 3000; —— 因为不是编译期常量,不会内联,且每次运行值可能不同
  • 影响:如果 A 类引用了 B 类的编译期常量,B 类修改该值后只重新编译 B,A 类不重新编译就会沿用旧值(因为 A 里已被替换成字面量)
  • 安全做法:不确定是否编译期可算出的值,统一用 static final + 显式初始化块或私有静态方法封装,避免意外内联

最常被忽略的是 final 对象内容可变这件事——很多人以为加了 final 就万事大吉,结果在多线程里共享了一个 final List,还往里 add 元素,既没同步也没用不可变容器,问题就藏得特别深。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

143

2025.08.06

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

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

81

2026.01.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

810

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1556

2023.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

595

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1556

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

641

2023.11.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

928

2026.02.13

热门下载

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

精品课程

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

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