天天看點

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

作者:是啊超ya

一、final關鍵字介紹及引入

首先說明一下final關鍵字的基本用法,final翻譯過來就是最終的意思,也就是處于最後的位置,是不可被修改的,final關鍵字主要用于修飾類、方法和變量

二、final關鍵字修飾類

final修飾類表明該類不能被繼承

1、簡單案例分析

  • 這裡先是定義了一個Animal動物類,并且在其類前加上了final關鍵字
final class Animal{}
           
  • 然後執行了一步這樣的操作,用一個Wolf類去繼承這個動物類,但是系統卻報出了錯誤
class Wolf extends Animal{}     //不能繼承

           
Java | final關鍵字快速上手「通俗易懂,看這篇就夠了」
  • 從中可以看出,對于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;     不能第二次指派

           
Java | final關鍵字快速上手「通俗易懂,看這篇就夠了」
  • 從代碼和運作結果來看,應該是一目了然,不可以做二次指派
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修飾的引用類型變量,雖然其位址值不能改變,但指向對象的内容可以改變