0

0

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

P粉602998670

P粉602998670

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

|

855人浏览过

|

来源于php中文网

原创

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

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

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

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

常见错误现象:

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

使用场景:

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

注意点:

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

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

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

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

常见错误现象:

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

使用场景:

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

关键区别

Draft&Goal-Detector
Draft&Goal-Detector

检测文本是由 AI 还是人类编写的

下载
  • 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 引用逃逸)
  • 若持有可变对象(如 DateArrayList),必须做防御性拷贝(new ArrayList(input))并返回副本

容易被忽略的地方:

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

115

2025.08.06

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

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

30

2026.01.26

string转int
string转int

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

463

2023.08.02

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

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

350

2023.11.13

java boolean类型
java boolean类型

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

29

2025.11.30

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

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

1501

2023.10.24

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

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

15

2025.11.27

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

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

15

2025.11.27

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

15

2026.01.29

热门下载

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

精品课程

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

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 52.8万人学习

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

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