课时65:final关键字

简介: 我今天分享的是 Java 中 Final 关键字的相关知识。主要分为以下三个部分。1. Final锁死继承路2. Final封印复写门3. Final打造常量库

课时65:final关键字

 

摘要: 我今天分享的是 Java 中 Final 关键字的相关知识。主要分为以下三个部分。

1. Final锁死继承路

2. Final封印复写门

3. Final打造常量库

   

01. Final锁死继承路

 

在程序里,final代表一种终结的概念。在 Java 中,用 Final 关键字能实现这几个功能:定义不能被继承的类,定义不能被复写的方法,还有定义常量。

先讲讲定义不能被继承的类。

final class Channel { // 这个类不能够有子类
class DatabaseChannel extends Channel { // 错误的
}
public class JavaDemo {
public static void main(String args[]){
}
}

image.png

Final 定义的类不能有子类,也就不存在父类和子类的关系了。比如说,我们写个  Final Class China  ,这就意味着  China  类不能再有子类了,就像咱们班的某个同学,没有“下属”啦。


要是再写个类去继承它,比如  class Database extends China  ,编译运行肯定报错,系统会提示无法从 Final 定义的  China  类继承。以后一看到用 Final 定义的类,就得知道它不能有子类。

 

02.  Final封印复写门

 

再说说定义不能被复写的方法。当子类继承父类后,正常情况下是可以复写父类中的方法的。但要是你不想让某个方法被子类复写,就可以用 Final 来定义。比如,我们把之前那个 Final 关键字去掉,  China  类就可以有子类了。然后在里面写个  Connect  方法 ,这个方法正常情况下是可以被复写的,只要写个一模一样的方法就行。


但要是在方法定义前加上 Final ,再编译运行,就会报错,提示  Database  类中的  Connect  方法无法覆盖  China  类中的  Connect  方法,这就表明这个方法不能被复写。

class Channel { //这个类不能够有子类
public final void connect() {}
}
class DatabaseChannelextends Channel { // 错误的
public void connect() {}
public class JavaDemo {
public static void main(String args[]) {
}
}

image.png

一般做应用层开发,别人给你搭好架构,你只管写代码,可能很少用到final。但要是涉及到底层设计,就会经常用到。在 Java 的很多类库里面,就能看到 Final 关键字,后面我们慢慢留意。


接着讲讲常量。在一些系统开发里,可能会用1表示开关打开,0表示开关关闭。但直接用 0 和 1 操作容易弄混,所以最好用一些名称来代表它们。比如说,在代码里写  Private int on = 1;  和  private int off = 0;  ,用变量操作确实更清楚些。但问题是,变量的值是会变的,这就麻烦了。我们肯定希望它不能改变,这时候 Final 关键字就派上用场了。


 Final 可以用来定义常量,常量的值一旦定义就不能修改。比如,我们用 Final 定义常量,写成 Final int ON = 1 ;  和  Final int OFF = 0 ;  ,要是再想去改  ON  或者  OFF  的值,代码一编译就会报错,提示无法为最终变量重新分配值,这就说明它们是常量,不能再修改了。

class Channel { //这个类不能够有子类
private final int ON =1 ; // ON就是常量
private final int OFF = 0 ; // OFF就是常量
public final void connect() {
ON =2 ;1
}
}
public class JavaDemo {
public static void main(String args[]) {
}
}

image.png

03.  final打造常量库

 

既然说到常量,常量一般是公共的,不是属于每个对象自己的。为了体现共享的概念,我们常用全局常量的形式来定义。怎么定义全局常量呢?用  Public static final 。比如说,按照上面的程序,最严格的写法就是  Public static final int ON = 1 ;  ,这就是全局常量。在代码里,对于 Final 关键字,大家最要记住的就是全局常量的定义。


全局常量和普通变量还有个区别,定义全局常量的时候,每个字母都得大写。普通变量可以用小写单词,第二个单词首字母大写,常量可必须全大写。


再看个验证常量的程序代码。之前我们写过  String strA = "info" ;  , StringBuffer strB = new StringBuffer(); strB.append("info").append("3"); ,然后问 strA == strB.toString() 的结果是多少,之前讲过这里涉及两种字符串值的问题。


那要是在定义  strA  的时候加上 final ,也就是  final String strA = "info" ;结果又是什么呢?答案是 true  。一旦加final ,  strA  就不是变量而是常量了。

image.png

image.png

另外,在方法里,也可以用 Final 来定义参数,这时候也表示常量的概念。通过这些代码,就能对 Final 关键字有个全面的验证了。记住,用final定义常量是最常见也最有用的用法。

image.png

相关文章
|
存储 关系型数据库 数据库
深入了解 PostgreSQL:功能、特性和部署
PostgreSQL,通常简称为Postgres,是一款强大且开源的关系型数据库管理系统(RDBMS),它在数据存储和处理方面提供了广泛的功能和灵活性。本文将详细介绍 PostgreSQL 的功能、特性以及如何部署和使用它。
1454 1
深入了解 PostgreSQL:功能、特性和部署
|
Rust JavaScript Go
2024年十大值得关注的编程语言
探索2024年最有影响力的编程语言:Python的多功能无与伦比,JavaScript在Web领域的统治地位,Rust的高效性,等等。
|
存储 资源调度 Java
计算机基础(1)——计算机体系结构和组成
计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。 在过去的几十年里,计算机科学经历了令人瞩目的飞速发展。经历了电子管、晶体管、集成电路的世代发展,体积越来越小、性能越来越强,为人类带来了巨大的便利和变革,下面我们来回顾计算机的发展历程。
3674 5
计算机基础(1)——计算机体系结构和组成
|
程序员
【工具使用】Intellij IDEA 自动清除无效 import 包 和 清除无效 import包 的快捷键
【工具使用】Intellij IDEA 自动清除无效 import 包 和 清除无效 import包 的快捷键
5323 0
|
人工智能 自然语言处理 程序员
1024程序员节,你都参与了什么?
1024程序员节,阿里云推出多场景开发者活动,涵盖AI助手、云上实操挑战等,提供丰富的上手操作机会及小礼品,助你体验最新技术,提升技能。活动链接:[点击进入](https://developer.aliyun.com/topic/2024/1024cloudup?spm=a2c6h.13066369.question.3.7a606f95NIpx0S)
|
编解码 自然语言处理 JavaScript
智谱发布GLM-OS概念及Agent产品,CogAgent-9B模型开源助力GUI交互场景
11月29日,智谱正式提出 GLM-OS 概念,并发布 AutoGLM 和 GLM-PC 两款 Agent 产品。近期GLM-PC 的基座模型—— CogAgent-9B 开源,供社区进一步开发。
1016 8
|
缓存 监控 测试技术
获取API接口数据的最佳实践详解
在开发过程中,与API进行交互是获取数据和服务的关键步骤。本文详细介绍了10个最佳实践,包括明确需求和文档、错误处理、数据验证、性能优化、安全性、日志和监控、版本控制、代码复用和维护、测试以及遵守法律和道德规范,帮助开发者更高效地从API获取数据,确保数据的准确性、安全性和性能。
|
SQL 前端开发 Java
SpringBoot 拦截器 统一结果返回 统一异常处理
SpringBoot 拦截器 统一结果返回 统一异常处理
1665 0
|
机器学习/深度学习 编解码 计算机视觉
【YOLOv8改进】 SPD-Conv空间深度转换卷积,处理低分辨率图像和小对象问题 (论文笔记+引入代码)
YOLO目标检测专栏探讨了CNN在低分辨率和小目标检测中的局限性,提出SPD-Conv新架构,替代步长卷积和池化层,通过空间到深度层和非步长卷积保持细粒度信息。创新点包括消除信息损失、通用设计和性能提升。YOLOv5和ResNet应用SPD-Conv后,在困难任务上表现优越。详情见YOLO有效改进系列及项目实战目录。
|
运维 Docker 微服务
深入浅出:使用Docker容器化部署微服务架构
在当今快速演进的软件开发领域,微服务架构因其灵活性和可扩展性而成为了企业级应用的首选。然而,部署和管理众多微服务的复杂性也随之增加。本文将探讨如何通过Docker容器技术简化微服务架构的部署和运维,实现服务的快速交付和高效管理。我们将从Docker的基本概念入手,逐步深入到如何构建、部署和管理容器化的微服务,最终展示一个简单的微服务应用部署案例,帮助读者理解并掌握使用Docker容器化部署微服务的全过程。