在Java里final关键字如何应用_Java不可变设计与限制解析-java教程

final修饰变量只锁住引用不可再赋值,不保证对象内容不可变;用于方法表示不可重写但可重载;用于类表示不可继承;final字段需在构造完成前安全初始化以保障线程可见性。

final修饰变量时,到底锁住了什么

很多人以为final让变量“不可变”,其实它只保证**引用不可再赋值**,不等于对象内容不可变。比如final List list = new ArrayList();之后,你不能写list = new ArrayList();(编译报错),但list.add("a")完全合法。

常见错误现象:
• 用final Map存配置,运行时被意外修改,误以为安全
• 单元测试里反复add()同一个final集合,结果前一个测试污染后一个

  • 若需真正不可变容器,用Collections.unmodifiableList()或ImmutableList.of()(Guava)
  • 对自定义类,final字段 + 私有构造 + 不暴露可变内部状态,才是完整不可变设计
  • 基本类型(int、boolean)用final确实等效于常量,JVM可能内联优化

final方法为什么不能被重写,但能被重载

final加在方法上,是告诉编译器“这个行为不允许子类改变”。它不影响重载(overload),只阻止重写(override)。比如父类有final void log(String msg),子类可以新增void log(String msg, int level),但不能写@Override void log(String msg)。

使用场景:
• 模板方法模式中,templateMethod()设为final,强制子类只实现钩子方法
• 工具类中关键校验逻辑(如validateInput()),防止下游绕过安全检查

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

  • 性能影响极小:现代JVM对final方法可能做去虚化(devirtualization),但别为此刻意加final
  • 注意IDE警告:如果一个final方法从未被继承,加final只是增加维护噪音
  • 接口里不能用final方法(Java 8+允许default和static,但final仍非法)

final类的继承限制与真实用途

声明final class StringUtils,意味着它既不能被继承,也不能被代理(除非用字节码工具)。这不是为了“防止别人扩展”,而是明确表达“这个类的设计边界已封闭”。String、Integer、LocalDateTime都是典型例子。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 在Java里final关键字如何应用_Java不可变设计与限制解析-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3998846+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3998847+
  • 本周更新: 0+
  • 最后更新: 2026-03-16