Java | final關鍵字快速上手「通俗易懂,看這篇就夠了」

是啊超ya 發佈 2022-10-28T10:11:18.413581+00:00

一、final關鍵字介紹及引入首先說明一下final關鍵字的基本用法,final翻譯過來就是最終的意思,也就是處於最後的位置,是不可被修改的,final關鍵字主要用於修飾類、方法和變量二、final關鍵字修飾類final修飾類表明該類不能被繼承1、簡單案例分析這裡先是定義了一個A

一、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文檔,所以不太了解

  • 首先第一個就是String類
  • 然後是System類
  • 最後再來一個StringBuilder類

其實在JDK中還要很多我們熟知的類都是用final關鍵字修飾,表明這些類都是不可以被繼承的,是一種Java官方提供給我們的工具類,我們可以直接拿來使用,調用其中的功能即可

三、final關鍵字修飾方法

final修飾方法表示該方法不能被重寫

  • 首先我們定義一個Peopel人類
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修飾的引用類型變量,雖然其地址值不能改變,但指向對象的內容可以改變
關鍵字: