讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java中final修饰变量代表什么_Java不可变性解析

轻婷酱_2978

轻婷酱_2978

发布时间:2026-01-29 12:43:02

|

875人浏览过

|

来源于php中文网

原创

final修饰基本类型变量时值不可再赋值,修饰引用类型时引用不可变但对象状态可能改变,修饰方法和类则限制重写与继承;final是实现不可变性的必要条件而非充分条件。

在java中final修饰变量代表什么_java不可变性解析

final修饰基本类型变量时,值不可再赋值

final 用在基本类型(如 int、boolean、double)上,表示该变量一旦初始化完成,就不能再被重新赋值。这不是“不可变对象”的概念,而是“不可再绑定”——它锁住的是变量与值之间的绑定关系。

常见错误现象:

  • 编译时报错 cannot assign a value to final variable
  • 在构造器或初始化块中漏掉赋值,导致编译失败(未初始化的 final 变量不合法)

使用场景:

JavaStoryDevelop
JavaStoryDevelop

你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在

下载
  • 常量定义(配合 static,如 public static final int MAX_RETRY = 3;)
  • 构造器中一次性注入依赖(如 final UserService service;),避免后续被意外覆盖

注意点:

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

  • final int x; 必须在声明时、构造器内或实例初始化块中完成赋值
  • 不同于 C++ 的 const,Java 的 final 不影响底层内存或线程可见性保障(需配合 volatile 或同步机制才能确保安全发布)

final修饰引用类型变量时,引用不可变,但对象状态可能改变

这是最容易误解的一点:final List<string> list = new ArrayList<>();</string> 中,list 这个引用不能再指向另一个 List 实例,但完全可以通过 list.add("foo") 修改其内部状态。

常见错误现象:

  • 误以为加了 final 就等于“不可变容器”,结果在多线程中出现竞态修改
  • 把 final 当作线程安全的替代方案,实际毫无作用

使用场景:

  • 防止引用被意外重赋值(例如回调中捕获外部变量)
  • 配合匿名内部类或 lambda 表达式使用(Java 8+ 允许“有效 final”,但语义一致)

关键区别:

  • final 控制的是变量本身(栈上引用地址)是否可变
  • 对象的可变性由其类设计决定(比如 String 是不可变类,ArrayList 不是)
  • 真正的不可变对象需要:所有字段为 final + 类为 final + 不提供修改状态的方法 + 防止子类篡改(如防御性拷贝)

final修饰方法和类时,限制继承与重写

final 加在方法上(如 public final void close()),表示子类不能重写它;加在类上(如 final class StringUtils),表示该类不能被继承。

性能 / 兼容性影响:

  • JVM 可对 final 方法做内联优化(尤其在早期 HotSpot 中更明显,现代 JVM 已弱化此优势)
  • final 类天然杜绝了继承带来的多态不确定性,适合封装核心工具类或值对象

容易踩的坑:

  • 过度使用 final 类,导致无法 Mock(如单元测试中想 mock 一个 final 类的方法,需依赖 ByteBuddy 等字节码工具)
  • 在接口实现类中把 public 方法声明为 final,可能破坏框架约定(如 Spring AOP 代理要求方法可被重写)

参数差异:

  • final 修饰形参(如 void process(final String input))仅防止方法体内重新赋值,不影响调用方,也无运行时开销

不可变性 ≠ final,但 final 是构建不可变性的必要条件之一

很多人混淆“不可变性”(immutability)和 final。前者是语义契约,后者只是实现手段之一。

真正不可变对象的关键要素:

  • 所有字段必须是 final(否则状态可能被修改)
  • 类自身必须是 final(否则子类可添加可变字段或重写方法)
  • 构造器必须完成完全初始化(防止 this 引用逃逸)
  • 若持有可变对象(如 Date、ArrayList),必须做防御性拷贝(new ArrayList<>(input))并返回副本

容易被忽略的地方:

  • 即使字段全 final,如果引用了非不可变类型且未做防御性拷贝,对象仍是可变的
  • final 字段的初始化顺序很重要:若在构造器中调用子类可能重写的方法,仍可能导致读到未初始化的值(违反安全发布)
  • 序列化/反序列化可能绕过构造器逻辑,破坏不可变性(需自定义 readObject)

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

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

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

2651

2025.08.06

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

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

477

2026.01.26

string转int
string转int

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

6539

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

2130

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

163

2025.11.30

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

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

6124

2023.10.24

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

355

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

355

2025.11.27

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn