Java 中的 final 类

2025 年 8 月 4 日 | 阅读 6 分钟

在 Java 中,final 类是一个不能被任何其他类继承(扩展)的类。换句话说,没有人可以创建 final 类的子类。

我们可以使用 final 关键字 将一个类声明为 final。

一旦一个类被标记为 final,我们就不能创建它的子类。

Final 类的用途

将一个类设为 final 有很多原因,其中一些如下:

  • 防止继承:如果我们不希望其他开发人员扩展我们的类并更改其行为,则应将该类声明为 final。
  • 出于安全目的:有时,出于安全原因,我们不希望其他人覆盖我们的类方法。因此,通过将我们的类设为 final,我们确保我们的逻辑将保持不变。
  • 为了更好的性能:当 Java 知道一个类不能被扩展时,它会进行一些性能优化。例如,final 类中的方法调用有时可能更快。
  • 创建不可变类:许多不可变类(创建后其对象无法更改的类)都被标记为 final,例如 String 类。

示例:Final 类

编译上述代码时,会显示编译时错误,如下所示:

预定义的 Final 类

Java 中的许多内置类都被标记为 final。一些最常用的包括:

String:String 类是 final 的,因为它旨在不可变——一旦我们创建了一个字符串,就无法更改它。它用于 Java 中的文本。因此,将其设为 final 可确保没有人可以通过扩展该类来更改字符串的工作方式。

Math:Math 类提供了基本的数学运算,包括 pow()、sqrt() 和 abs()。它被标记为 final,以防止通过扩展该类来更改这些重要函数的工作方式。

包装类,如 Integer、Double 等:这些类将原始类型(如 int 或 double)转换为对象。它们是 final 的,因此它们的行为保持一致且可靠。

Final 类可以有 Final 方法或变量吗?

是的,final 类可以有 final 方法或变量。Final 方法意味着我们不能在子类中覆盖该方法。Final 变量意味着一旦赋值,就无法更改。

在 final 类中,我们仍然可以像使用其他类一样使用方法和变量。但由于没有子类可以扩展 final 类,因此将方法设为 final 并不会带来多少额外的价值,除非我们考虑将来移除 final 关键字的可能性。

示例

编译并运行

输出

ID: 1, Name: Thomas 

解释

在上面的 Java 程序中,创建了 Teacher 类,它被声明为 final,这意味着任何其他类都不能扩展它。Teacher 类有两个 String 变量,name 和 id。然后我们使用构造函数来初始化这些值。它还有一个名为 displayDetails() 的方法,用于打印教师的详细信息,即 id 和 name。在 Main 类中,使用 ID 和姓名创建了一个 Teacher 对象,然后通过调用 displayDetails() 方法显示其详细信息。

Final 类的优点

  • 防止继承:final 类不能被子类化,因此可以防止通过继承而被修改。假设我们不想改变类的行为,那么我们可以将该类标记为 final。
  • 更好的性能:由于 Java 系统知道该类不会被更改,因此它可以运行代码的速度更快一些。
  • 提高安全性:没有人可以覆盖这些方法。这有助于避免错误或失误,并保持程序按设计运行。

Final 类的缺点

缺乏灵活性:由于 final 类不允许继承,我们无法通过创建子类来添加或更改新功能。如果我们要更新或自定义类,将来会成为一个问题。

违反开闭原则:软件设计中有一个称为开闭原则的规则,其中我们必须能够将新功能插入软件而不更改其现有代码。Final 类违反了这条规则,因为它们不能被更改,因此它们仅限于添加新功能而不修改类。

更难用于单元测试:当我们编写单元测试时,我们会使用 Mockito 等工具来创建类的假版本。但 final 类很难模拟,因为它们不能被扩展。要模拟它们,我们需要额外的设置,例如在 Mockito 中启用特殊选项。

为什么我们应该避免使用 Final 类?

有时我们应该避免使用 final,原因如下:

依赖于子类的框架:Final 类可能会干扰框架的使用,因为某些库和框架(如 Hibernate 或 Spring)使用子类化或代理来添加日志记录、事务等功能。

未来的需求:如果我们认为以后需要扩展该类,最好不要将其设为 final。我们只需要确保文档说明它不是为继承而设计的。

结论

Java 中的 Final 类是一个重要而强大的概念,它有助于我们编写安全、可靠和可预测的代码。它确保该类不能被扩展,这意味着 final 类的行为不能通过继承来改变。

Final 类在许多情况下都很有用,尤其是在我们希望防止滥用或保护敏感操作时。了解何时以及为何应该使用 final,有助于我们更好地编写 Java 代码,并且易于维护和调试。通过有目的、有条理地使用,我们的应用程序将在长期内受益。

Java Final 类选择题

1. 在 Java 中使用 final 关键字时会发生什么?

  1. 允许随时修改类
  2. 允许多重继承
  3. 使类编译速度更快
  4. 阻止类被继承
 

答案: D

解释:final 关键字限制了类的继承。


2. 何时应避免将类设为 final?

  1. 在使用 Spring 或 Hibernate 等框架时
  2. 当类只有一个方法时
  3. 当类很短时
  4. 当类是 public 时
 

答案:C

解释:一些框架依赖于子类化。如果类是 final 的,它可能无法与它们正常工作。


3. Java 编程如何帮助 Final 类?

  1. 性能和安全性
  2. 代码可维护性
  3. 编写单元测试的能力
  4. 易于继承
 

答案: A

解释:final 类可以使代码更安全,并通过防止继承来允许 JVM 优化性能,因为它知道类不会被更改。


4. 选择 Final 类的缺点之一。

  1. 它允许继承,这使得代码难以管理
  2. 它通过阻止进一步的子类化来限制灵活性
  3. 它破坏了封装原则
  4. 它使类的使用速度变慢
 

答案: B

解释:主要缺点之一是 final 类不能被扩展。如果将来需要添加新功能或自定义类,它会限制灵活性。


5. 将类声明为 final 的优点是什么?

  1. 使类更容易子类化
  2. 它会自动将所有变量设为 static
  3. 它阻止其他开发人员修改其行为
  4. 它确保类永远不能有构造函数
 

答案:C

解释:通过将类设为 final,我们确保其功能不会通过继承而被更改,从而保留其原始行为。


下一个主题Java 字体