一、final關鍵字介紹及引入
首先說明一下final關鍵字的基本用法,final翻譯過來就是最終的意思,也就是處于最後的位置,是不可被修改的,final關鍵字主要用于修飾類、方法和變量
二、final關鍵字修飾類
final修飾類表明該類不能被繼承
1、簡單案例分析
- 這裡先是定義了一個Animal動物類,并且在其類前加上了final關鍵字
final class Animal{}
- 然後執行了一步這樣的操作,用一個Wolf類去繼承這個動物類,但是系統卻報出了錯誤
class Wolf extends Animal{} //不能繼承
- 從中可以看出,對于final關鍵字修飾的類,該類是不可以被繼承的,這個我們前面講static關鍵字講到的一個知識點【工具類】可以聯系起來,我們知道,工具類是不可以被繼承的,隻是将一個功能封裝成為一個類,然後外界可以通過這個類去很快地實作一些功能,進而提高開發的效率,是以對于工具類,我們就可以給其加上final關鍵字
2、JDK中的final修飾類【String、System、StringBuilder】
對于JDK【Java開發工具包】中也是有許多我們常見的用final修飾的類,隻是我們沒有認真地去閱讀API文檔,是以不太了解
其實在JDK中還要很多我們熟知的類都是用final關鍵字修飾,表明這些類都是不可以被繼承的,是一種Java官方提供給我們的工具類,我們可以直接拿來使用,調用其中的功能即可
三、final關鍵字修飾方法
final修飾方法表示該方法不能被重寫
class People{
public final void eat(){ //不能重寫
System.out.println("人都要吃東西");
}
}
- 這裡要注意,我并沒有拿final關鍵字去修飾這個類,==是以是可以被繼承的==,但是我們這個類中的eat()方法前加了一個final關鍵字,接着就定義一個Teacher老師類去繼承它
class Student extends People{
@Override
public void eat() {
System.out.println("學生吃很多");
}
}
- 在繼承子類中,我去重寫了這個方法,然後就報出了這樣的錯誤:point_down:
- 這就可以看出,被final修飾的方法是不可以被繼承的子類所重寫的,通俗一點講就是【子類要老老實實地繼承父類的方法,不可以做任何篡改】這點也是要記住哦:point_left:
四、final關鍵字修飾變量
final修飾成員變量表示該變量在進行聲明時隻能進行一次指派,不可在後面修改其值(有且僅能被指派一次)
- 我們知道,變量分為局部變量和成員變量,而成員變量又分為靜态成員變量和執行個體成員變量,接下來讓我們一起來看看吧:runner:
1、局部變量
- 對于局部變量來講,可以是過程中定義的,也可以是形參變量
//1.局部變量
final double pi = 3.14;
//pi = 9.1; 不能第二次指派
- 從代碼和運作結果來看,應該是一目了然,不可以做二次指派
public static void buy(final double discount){
//discount = 9.9; 不能第二次指派
}
buy(7.9); //接值的時候為第一次指派
- 這裡的方法形參也是一樣,如果定義成用final關鍵字修飾,那一定是不可以在方法體中對其進行指派的,==因為你在調用這個方法的時候系統會讓你一定要傳入參數==
2、成員變量
接下來我們來看看final修飾的成員變量
public class Test2 {
//2.成員變量 - 靜态成員變量(常量)
public static final String SchoolName = "清華大學";
//2.成員變量 - 執行個體成員變量(幾乎不用)
private final String name = "豬剛鬣";
//SchoolName = "ddd"; 無法指派
Test2 t2 = new Test2();
System.out.println(t2.name);
//t2.name = "豬八戒"; 無法指派
}
- 好,我們先來看一下這個,在這個Test2類中,聲明了一個靜态成員變量,一個執行個體成員變量,都用final關鍵字對其進行了一個修飾,而且都有了一個初始值
- 是以在下面的代碼中,無法對則會兩個成員變量再次進行指派,否則就會出現和上面那些報錯一樣的情況,算了,還是給出來看一下吧
五、final關鍵字注意事項
- 這裡有些小夥伴可能就有疑惑了,這個final關鍵字難道真的是一毛不拔嗎,無論是修飾類、方法還是變量,完全就不能修改裡面的任何東西嗎?
- 那倒也不是:point_up:
final修飾的變量是基本類型:那麼變量存儲的資料值不能發生改變:grin:
final修飾的變量是引用類型,其位址值不能改變,但指向對象的内容可以改變:heart_eyes:
class Teacher{
private String hoppy;
public Teacher(String hoppy) {
this.hoppy = hoppy;
}
public String getHoppy() {
return hoppy;
}
public void setHoppy(String hoppy) {
this.hoppy = hoppy;
}
}
final Teacher t = new Teacher("吃飯,睡覺,打豆豆");
System.out.println(t.getHoppy());
//t = null; //二次指派
t.setHoppy("遊泳");
System.out.println(t.getHoppy());
- 從上述代碼可以看出,我通過final修飾的Teacher類型去new了一個對象,然後為其興趣愛好賦了一個初值,那這個對象的位址能不能被修改呢,答案是【不可以】,這就算是一個二次指派了,但是這個對象的内容我們是可以修改的,隻需要調用這個類中的SetHoppy()方法就可以了,可以看出系統也是沒有給我們報錯
六、總結與回顧
- 在本文中,我們講解了Java中的final關鍵字,知道了用final關鍵字修飾的類、方法和變量都是很嚴謹,不能做修改的,但是對于final修飾的引用類型變量,雖然其位址值不能改變,但指向對象的内容可以改變