课时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[]){ } }
用 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[]) { } }
一般做应用层开发,别人给你搭好架构,你只管写代码,可能很少用到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[]) { } }
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 就不是变量而是常量了。
另外,在方法里,也可以用 Final 来定义参数,这时候也表示常量的概念。通过这些代码,就能对 Final 关键字有个全面的验证了。记住,用final定义常量是最常见也最有用的用法。