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日

相关文章

  • Java打印数组的三种方法整理

    Java打印数组的三种方法整理 在Java程序中,经常需要对数组进行打印输出操作。本文将整理并详细讲解Java打印数组的三种方法,以供参考。 方法一:使用for循环遍历数组并打印 使用for循环遍历数组,逐个将数组元素打印出来。 示例代码: int[] arr = {1, 2, 3, 4, 5}; for (int i = 0; i < arr.len…

    Java 2023年5月26日
    00
  • 49个Spring经典面试题总结(附带答案)

    着手准备 首先,要对本文提到的49个Spring相关面试题有一定的了解。 其次,要清楚掌握Spring框架的核心概念和基础知识。 最后,要结合面试框架,将知识点学以致用,深入理解每个问题,适当练习,加深印象,提升答案的质量。 问题类型详解 Bean的定义,作用域、生命周期等问题 解释Spring中Bean的定义,Spring Bean的作用域、生命周期等问题…

    Java 2023年5月20日
    00
  • JDK安装配置教程

    JDK安装配置教程 1. 安装JDK 要使用Java开发应用程序,需要先安装Java开发工具包(JDK)。JDK可以从Oracle官网下载,下载地址为:https://www.oracle.com/technetwork/java/javase/downloads/index.html。 根据系统位数选择相应版本的JDK下载,安装程序为exe或dmg(如果是…

    Java 2023年5月26日
    00
  • 基于SpringBoot 使用 Flink 收发Kafka消息的示例详解

    基于 SpringBoot 使用 Flink 收发 Kafka 消息主要包含以下步骤: 第一步:创建 SpringBoot 项目 首先我们需要创建一个 SpringBoot 项目。在 pom.xml 文件中添加 flink 和 kafka 相关依赖: <dependency> <groupId>org.apache.flink<…

    Java 2023年6月2日
    00
  • MyBatis通用的10种写法总结大全

    MyBatis通用的10种写法总结大全 1. 基础查询 示例1: xml <select id=”selectById” resultType=”com.example.model.User”> select * from user where id = #{id} </select> 示例2: xml <select id=”…

    Java 2023年5月20日
    00
  • JSP开发入门(二)—-JSP语法的基本原理

    下面是针对“JSP开发入门(二)—-JSP语法的基本原理”这篇文章的详细讲解攻略。 一、JSP语法基本原理 文章中讲解了JSP页面的作用和基本语法,JSP是一种直观、易学易用的Web开发技术。JSP将HTML、JavaBean和Java代码混合在一个文件中,由Java服务器驱动执行,同时生成动态的HTML网页。JSP页面以”.jsp”为后缀名,当web服…

    Java 2023年6月15日
    00
  • Java Properties作为集合三个方法详解

    当我们使用Java进行编程时,经常需要使用配置文件来存储一些关键的配置信息,于是Java提供了一个名为Properties的类来处理这个问题。Properties是一个Map集合,其中的key和value都必须是字符串类型。下面将详细讲解Java Properties作为集合的三个常用方法:getProperty、setProperty和load。 getP…

    Java 2023年6月15日
    00
  • seatunnel 2.3.1全流程部署使用教程

    Seatunnel 2.3.1全流程部署使用教程 简介 Seatunnel是一款基于Socks5协议的加密代理工具,可以实现我们的网络隐私和安全。Seatunnel支持Windows、Linux、macOS等多个平台使用。 本教程将介绍Seatunnel的全流程部署和使用,包括下载安装、配置文件和证书生成、启动使用等。 步骤一:下载Seatunnel 在Se…

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