final修饰的参数不可重新赋值,但允许修改其指向对象的内容:基本类型值不可变,引用类型可调用方法改变内部状态,仅禁止变量指向新对象。

不能。用 final 修饰的方法参数,在方法体内不允许被重新赋值,编译器会直接报错。
final 参数的作用很明确
它锁定的是“参数变量本身”,而不是变量所指向的对象内容:
- 对基本类型(如 int、boolean),final 阻止值被修改;
- 对引用类型(如 List、String、自定义对象),final 阻止变量指向另一个新对象,但允许调用该对象的方法改变其内部状态(比如 list.add() 或 obj.setName())。
常见错误写法(编译不通过)
以下代码都会在编译阶段失败:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- final int x = 5; x = 10; → 报错:Cannot assign a value to final variable 'x'
-
final List
list = new ArrayList(); list = new ArrayList(); → 同样报错,因为改变了引用指向
但这些操作是完全允许的
只要不改变参数变量本身的绑定关系,就合法:
-
final List
list = new ArrayList(); list.add("hello"); → ✅ 可以,只改内容,没换对象 - final StringBuilder sb = new StringBuilder(); sb.append("world"); → ✅ 合法,sb 仍指向原对象
- final String s = "abc"; s.toUpperCase(); → ✅ 不报错(虽然 String 不可变,但调用方法本身不违反 final 规则)
为什么这么做?
加 final 是一种防御性编程习惯,主要为了:
- 防止误写赋值语句覆盖传入的原始值;
- 向阅读代码的人表明:这个参数只读,不打算让它“指向别处”;
- 配合 IDE 提示,提前发现潜在逻辑错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










