课时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

相关文章
|
10月前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
8438 18
资料合集|Flink Forward Asia 2024 上海站
|
8月前
|
存储 人工智能 自然语言处理
数势科技指标平台, 让数据产生最大价值
数势科技指标平台, 让数据产生最大价值
|
7月前
|
Java
课时18:Java运算符(逻辑运算符)
课时18介绍了Java中的逻辑运算符(与、或、非)。通过范例详细讲解了非操作的使用,展示了如何正确应用逻辑非(!)。接着分别探讨了与操作(& 和 &&)及或操作(| 和 ||),强调了短路运算符(&& 和 ||)在性能和安全性上的优势。课程通过具体代码示例演示了不同逻辑运算符的效果及其应用场景。
169 5
|
7月前
|
Java
课时10:Java数据类型划分(整型类型)
本文主要围绕Java中整型数据展开,详细讲解整型变量、常量的概念,整型数据运算规则,包括数据溢出问题及解决方法,数据类型转换(自动转换与强制转换)的原理和注意事项,同时介绍了整型数据默认值的相关知识,以及byte数据类型与int数据类型的关系和使用场景,帮助读者全面掌握Java整型数据的相关内容。
184 4
|
8月前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
1354 0
|
7月前
|
Java
课时50:字符串与字节
今天我分享的是字符串与字节的相关的知识,主要分为以下三部分。 1. 转换目的阐述 2. 相关方法介绍 3. 简单程序示例
95 17
课时50:字符串与字节
|
7月前
|
Java C语言 C++
课时9:Java数据类型划分(数据类型划分)
课时9介绍了Java的数据类型划分及其操作。Java数据类型分为基本数据类型和引用数据类型。基本数据类型包括八种:数值型(整形、浮点型)、字符型和布尔型;引用数据类型有数组、类和接口。重点讲解了每种数据类型的默认值、适用场景及选择原则,如整数用int,小数用double,日期时间用Long等。掌握这些内容对编程至关重要。
125 4
课时9:Java数据类型划分(数据类型划分)
|
7月前
|
Java
课时13:Java数据类型划分(布尔型)
观察布尔型的操作。布尔是一位数学家的名字,这个布尔发明了两个单词:True、False(一个表示真一个表示假)。一般布尔类型都只表示逻辑的计算结果。
162 9
|
7月前
|
Java
课时58:继承问题引出
今天我将围绕 Java 中继承问题展开,主要分为以下三部分。 1. 继承概念简述 2. 传统编程的弊端 3. 继承的必要性
|
7月前
|
Java
课时56:字符串格式化
今天我分享的是 Java 中字符串格式化的相关知识,主要分为以下三个部分。 1. Java 1.5的新特性 2. format方法详解 3. 功能价值剖析
103 4