Java的final修饰符

final 实例域

可以将实例域定义为 final。对于 final 域来说,构建对象时必须初始化 final 实例域,构造对象之后就不允许改变 final 实例域的值了。也就是说,必须确保在每一个构造器执行之后,final 实例域的值被设置,并且在后面的操作中,不能够再对 final 实例域进行修改。

例如,可以将 Employee 类中的 name 域声明为 final,因为在对象构建之后,这个值不会再被修改,即没有 setName() 方法。

class Employee {
	private final String name;
    ...
}

final 修饰符大都应用于基本(primitive)类型域,或不可变(immutable)类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类。例如,String 类就是一个不可变的类)。

对于可变的类,使用 final 修饰符可能会对读者造成混乱。例如,private final StringBuilder evaluations; 在 Employee 构造器中会初始化为 evaluations = new StringBuilder(); final 关键字只是表示 evaluations 对象变量不会再指向其他的 StringBuilder 对象。不过这个 StringBuilder 对象可以更改。

public void giveGoldStar() {
	evaluations.append(LocalDate.now() + ": Gold star!\n");
}

final 类和方法

阻止继承:final 类和方法。

有时候,可能希望阻止人们利用某个类定义子类。不允许扩展的类被称为 final 类。如果在定义类的时候使用了 final 修饰符就表明这个类是 final 类。如果将一个类声明为 final,其中的所有方法自动地成为 final,而不包括数据域(final 类的数据域不会自动地成为 final 域)。

例如,假设希望阻止人们定义 Executive 类的子类,就可以在定义 Executive 这个类的时候,使用 final 修饰符声明。声明格式如下所示:

public final class Executive extends Manager {}

类中的特定方法也可以被声明为 final。如果这样做,子类就不能覆盖这个方法例如:

public class Employee {
   public final String getName() {
       return name;
   } 
}

将方法或类声明为 final 主要目的是:确保它们不会在子类中改变语义。例如:

  • Calendar 类中的 getTime() 和 setTime() 方法都声明为 final。这表明 Calendar 类的设计者负责实现 Date 类与日历状态之间的转换,而不允许子类处理这些问题。
  • 同样地,String 类也是 final 类,这意味着不允许任何人定义 String 的子类。换言之,如果有一个 String 的引用,它引用的一定是一个 String 对象,而不可能是其他类的对象。

有些程序员认为:除非有足够的理由使用多态性,应该将所有的方法都声明为 final。事实上,在 C++ 和 C# 中,如果没有特别地说明,所有的方法都不具有多态性。这两种做法可能都有些偏激。我们提倡在设计类层次时,仔细地思考应该将哪些方法和类声明为 final。

参考资料

Java核心技术卷一:基础知识》(第10版)第 4 章:对象与类 4.3.9 final 实例域

《Java核心技术卷一:基础知识》(第10版)第 5 章:继承 5.1.7 阻止继承:final 类和方法

原文链接:https://www.cnblogs.com/feiyu2/p/17349338.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java的final修饰符 - Python技术站

(0)
上一篇 2023年4月25日
下一篇 2023年4月25日

相关文章

  • OpenGL ES正交投影实现方法(三)

    OpenGL ES正交投影实现方法(三) 在前两篇文章中,我们已经了解了OpenGL ES正交投影的基本概念和实现方法。本文将为大家介绍如何在OpenGL ES中实现正交投影。我们将通过以下步骤来完成这个过程。 步骤一:创建投影矩阵 在OpenGL ES中,我们可以使用以下公式来创建投影矩阵: Ortho(left, right, bottom, top, …

    Java 2023年5月26日
    00
  • SpringBoot中热部署配置深入讲解原理

    SpringBoot中热部署配置深入讲解原理 热部署是指在应用程序运行时,对代码进行修改后,无需重启应用程序即可使修改生效。在Spring Boot中,可以通过配置实现热部署。本文将深入讲解Spring Boot中热部署的原理,并提供两个示例。 原理 Spring Boot中的热部署是通过Spring Boot DevTools实现的。Spring Boot…

    Java 2023年5月15日
    00
  • bootstrap table支持高度百分比的实例代码

    请跟我一起来详细探讨一下 “Bootstrap Table 支持高度百分比的实例代码” 的完整攻略。 1. 准备工作 首先,我们需要在 html 文件中引入必要的 js 和 css 文件: <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/boot…

    Java 2023年5月23日
    00
  • 颜值与实用性并存的数据库建模工具Chiner教程

    颜值与实用性并存的数据库建模工具Chiner教程 Chiner是一款同时具有出色颜值与实用性的数据库建模工具,支持多种数据库平台。以下是使用Chiner进行数据库建模的完整攻略。 步骤一:安装Chiner 首先,需要前往Chiner的官方网站下载Chiner安装包,并按照提示进行安装。也可以使用以下命令安装: npm install -g chiner 步骤…

    Java 2023年5月19日
    00
  • Spring AOP实现多数据源动态切换

    关于Spring AOP实现多数据源动态切换的攻略,我提供如下完整的步骤: 一、添加依赖 在Maven工程的pom.xml文件中,添加如下的Spring AOP和JDBC依赖: <dependencies> <dependency> <groupId>org.springframework</groupId> …

    Java 2023年5月20日
    00
  • jdbc中自带MySQL 连接池实践示例

    下面是 “jdbc中自带MySQL 连接池实践示例” 的详细攻略: 准备工作 下载并安装 MySQL 数据库,创建一个名为 test 的数据库并创建一个名为 user 的表,包含 id、name、age 三个字段。 下载并安装 JDK,确认环境变量配置正确。 示例一:使用 DriverManager 方式连接数据库 导入 JDBC 驱动 // 导入MySQL…

    Java 2023年6月16日
    00
  • 什么是并发收集器?

    并发收集器是Java虚拟机中的一种垃圾收集器,它能够在停顿时间(GC时应用程序暂停)减少的情况下进行垃圾收集。接下来将详细讲解并发收集器的使用攻略。 并发收集器的使用步骤 并发收集器的使用步骤包括如下几个方面: 1. 开启并发收集器 在启动应用程序的时候,加入如下命令来开启并发收集器: -XX:+UseConcMarkSweepGC 2. 配置停顿时间 停顿…

    Java 2023年5月10日
    00
  • java 使用URLDecoder和URLEncoder对中文进行处理

    下面是详细讲解“java 使用URLDecoder和URLEncoder对中文进行处理”的完整攻略。 什么是URLDecoder和URLEncoder URLDecoder和URLEncoder是Java中内置的两个工具类,用于将字符串进行URL编码和解码。URL编码是指将字符串中的特殊字符(如中文)转换成%XX的形式,以便在URL中传输。URL解码则是将%…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部