您的位置:首页 >final关键字在Java中对类、方法和变量的不可变性有重要影响,是实现不可变设计的关键机制。以下是其具体作用:1. final关键字对类的影响当一个类被声明为
发布于2026-01-22 阅读(0)
扫一扫,手机访问
final修饰变量仅保证引用不可变而非对象不可变;修饰方法禁止重写但允许重载;修饰类禁止继承且隐含所有方法final;final是不可变的必要非充分条件,需配合深拷贝和不可变视图。

声明为 final 的变量只能赋值一次,但若其类型是引用类型(如 ArrayList、StringBuilder),变量本身不可重新指向其他对象,而对象内部状态仍可修改。
final List list = new ArrayList<>(); → 合法:可执行 list.add("a")list = new ArrayList<>(); → 编译错误:不能重新赋值Collections.unmodifiableList() 或 List.of()(Java 9+)final 方法在运行时不会被动态绑定覆盖,JVM 可能对其内联优化;它不阻止同名不同参的重载,也不影响静态分派逻辑。
void foo(int x) 和父类 final void foo(String s) 是允许的@Override void foo(String s) 会触发编译错误:Cannot override the final method from Parentfinal,却忘了把钩子方法(hook method)留为 protected 非 final类被声明为 final 后,任何 extends 尝试都会在编译期报错;这也隐含意味着该类所有方法自动成为 final(即使没显式写),但字段仍可按需声明为 final 或非 final。
final class StringUtils { ... } → class MyUtils extends StringUtils 编译失败String、Integer、LocalDateTime 均为 final 类,这是不可变性的基础保障final 类仍可实现接口,也可被依赖注入框架代理(如 CGLIB 无法继承,但可用 JDK 动态代理接口)final 是不可变(immutability)的必要非充分条件。它只约束“引用不可变”或“结构不可扩展”,不保证深层状态安全。
new Date())→ 外部仍可修改该对象,破坏不可变性final 但类型是可变集合,且 getter 直接返回原始引用 → 调用方拿到后可随意修改final + 构造器深拷贝 + getter 返回不可变视图(如 Collections.unmodifiableXXX)public final class Config {
private final Map props;
public Config(Map input) {
// 错误:props = input;
this.props = Collections.unmodifiableMap(new HashMap<>(input));
}
public Map getProps() {
return props; // 安全:不可修改副本
}
}
很多人卡在“用了 final 就等于不可变”这层直觉上——其实 final 只锁住了引用和继承路径,真正的不可变需要整条构造与访问链都配合防御策略。
上一篇:PDF文档在线翻译技巧分享
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9