编程Java开发者

final在Java中的机制是如何工作的——用于变量、方法和类,以及不正确使用该修饰符可能引发哪些意外效果?

用 Hintsage AI 助手通过面试

答案。

final在Java中用于:

  • 变量 — 初始化后变为不可修改;
  • 方法 — 不能在子类中重写;
  • — 不能创建子类。

特点和细节:

  • final变量必须在声明时或构造函数中初始化;
  • final引用不允许更改引用,但可以更改引用指向的对象(如果它不是immutable!);
  • 无法从final类(例如StringMath)继承;
  • 即使是可继承的类,也不能重写final方法。
final class A {} // 不能创建 class B 继承 A class Parent { final void foo() { } } class Child extends Parent { // void foo() {} // 错误:无法返回foo } final int COUNT = 10;

反向提问。

可以更改final变量所引用的对象的状态吗?

答案: 可以,如果它不是immutable对象。例如:

final List<String> names = new ArrayList<>(); names.add("Vasya"); // 这是允许的——更改引用的对象,但不改变引用本身 names = new ArrayList<>(); // 编译错误

因不懂该主题细节而导致的实际错误示例。


故事

在日志系统中,唯一的final Logger在整个代码中传递,认为对象完全是安全的——但是通过公共方法更改设置,从而全球性地破坏了配置。

故事

在工具类中创建了final类型为List的字段,然后尝试将它们返回以供外部使用。外部代码通过获取的引用轻松修改了列表的内容——final对此并没有保护作用。

故事

出现了扩展基于final类的外部API的任务。由于它们,扩展变得不可能,只能复制逻辑并维护两个独立的产品分支,这使得迁移变得复杂。