Java的final修饰符

yizhihongxing

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日

相关文章

  • Jsp+Servlet实现文件上传下载 文件上传(一)

    “JSP+Servlet实现文件上传下载”,基本上可以分为文件上传和文件下载两个部分。下面详细讲解一下文件上传部分的实现过程。 文件上传实现 1. 文件上传表单页面 首先需要在页面上提供上传文件的表单。代码如下: <form action="upload" method="post" enctype="…

    Java 2023年6月15日
    00
  • Java和SQL实现取两个字符间的值

    要实现取两个字符间的值,可以使用Java的字符串截取和SQL的substr函数两种方法。 Java实现 1. 使用String.substring方法 使用String.substring方法可以截取原字符串中两个索引位置之间的子串。 String str = "Hello World"; String result = str.subs…

    Java 2023年5月27日
    00
  • 简单实例处理url特殊符号&处理(2种方法)

    处理URL中的特殊符号 & 是一个常见的问题,因为 & 符号在URL中有特殊的含义,它被用来分隔参数,不处理它可能会导致URL解析错误。本文将介绍两种方法来处理URL中的 & 字符。 方法一:使用urlencode()函数 urlencode()函数是PHP中一个非常有用的函数,主要用于将一个字符串转换为URL安全的字符串。在将一个含…

    Java 2023年5月20日
    00
  • Slf4j+logback实现JSON格式日志输出方式

    实现JSON格式日志输出方式需要使用Slf4j和logback两个工具,下面是详细攻略: 1.引入依赖 在项目的pom.xml文件中添加如下依赖: <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId>…

    Java 2023年5月26日
    00
  • js实现定时进度条完成后切换图片

    下面是实现”js实现定时进度条完成后切换图片”的完整攻略。 目录 1.需求分析 2.方案设计 3.实现步骤 4.示例说明 4.1 示例1:进度条倒计时 4.2 示例2:图片切换 1.需求分析 我们需要实现一个功能,当用户进入页面时,能够显示一个进度条,并在进度条走完后自动切换到下一张图片。 2.方案设计 根据需求,我们需要实现以下几个功能: 显示进度条 进度…

    Java 2023年6月16日
    00
  • SpringBoot整合MyBatis超详细教程

    Spring Boot是一个快速开发框架,可以帮助开发人员快速构建Web应用程序。MyBatis是一个流行的ORM框架,可以帮助开发人员轻松地访问数据库。本文将详细讲解如何在Spring Boot应用程序中整合MyBatis,包括如何配置MyBatis、如何使用MyBatis等。 配置MyBatis 在Spring Boot应用程序中,可以使用MyBatis…

    Java 2023年5月15日
    00
  • Mybatis实现关联关系映射的方法示例

    下面是详细讲解“Mybatis实现关联关系映射的方法示例”的完整攻略。 一、什么是关联关系映射 在实际开发中,我们往往会涉及到多个数据表之间的关联关系,比如一对多、多对多等关系。Mybatis作为一款优秀的ORM框架,在这方面也提供了相应的支持。关联关系映射是将多个表之间的关系映射到Java类之间的过程,使得Java类之间可以方便地进行关联操作。下面我们通过…

    Java 2023年5月20日
    00
  • SpringMVC MVC架构原理及实现方法详解

    以下是关于“SpringMVC MVC架构原理及实现方法详解”的完整攻略,其中包含两个示例。 SpringMVC MVC架构原理及实现方法详解 SpringMVC是一个基于MVC模式的Web框架,它提供了一种灵活、高效的方式来开发Web应用程序。在SpringMVC中,MVC是如何实现的?下面我们来详细讲解。 MVC架构原理 MVC是Model-View-C…

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