91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣用Java final 關鍵字

發布時間:2021-12-02 19:05:22 來源:億速云 閱讀:196 作者:柒染 欄目:互聯網科技

怎樣用Java final 關鍵字,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

下面好好地講一講 final 關鍵字,也希望給更多的小伙伴一些幫助。

盡管 繼承可以讓我們重用現有代碼,但有時處于某些原因,我們確實需要對可擴展性進行限制,final 關鍵字可以幫助我們做到這一點。

01、final 類

如果一個類使用了 final 關鍵字修飾,那么它就無法被繼承。如果小伙伴們細心觀察的話,Java 就有不少 final 類,比如說最常見的 String 類。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {}

為什么 String 類要設計成 final 的呢?原因大致有以下三個:

  • 為了實現字符串常量池

  • 為了線程安全

  • 為了 HashCode 的不可變性

更詳細的原因,可以查看我之前寫的一篇 文章。

任何嘗試從 final 類繼承的行為將會引發編譯錯誤,為了驗證這一點,我們來看下面這個例子,Writer 類是 final 的。

public final class Writer {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

嘗試去繼承它,編譯器會提示以下錯誤,Writer 類是 final 的,無法繼承。

怎樣用Java final 關鍵字

不過,類是 final 的,并不意味著該類的對象是不可變的。

Writer writer = new Writer();
writer.setName("沉默王二");
System.out.println(writer.getName()); // 沉默王二

Writer 的 name 字段的默認值是 null,但可以通過 settter 方法將其更改為“沉默王二”。也就是說,如果一個類只是 final 的,那么它并不是不可變的全部條件。

如果,你想了解不可變類的全部真相,請查看我之前寫的文章 這次要說不明白immutable類,我就怎么地。突然發現,寫系列文章真的妙啊,很多相關性的概念全部涉及到了。我真服了自己了。

把一個類設計成 final 的,有其安全方面的考慮,但不應該故意為之,因為把一個類定義成 final 的,意味著它沒辦法繼承,假如這個類的一些方法存在一些問題的話,我們就無法通過重寫的方式去修復它。

怎樣用Java final 關鍵字

02、final 方法

被 final 修飾的方法不能被重寫。如果我們在設計一個類的時候,認為某些方法不應該被重寫,就應該把它設計成 final 的。

Thread 類就是一個例子,它本身不是 final 的,這意味著我們可以擴展它,但它的 isAlive() 方法是 final 的:

public class Thread implements Runnable {
    public final native boolean isAlive();
}

需要注意的是,該方法是一個本地(native)方法,用于確認線程是否處于活躍狀態。而本地方法是由操作系統決定的,因此重寫該方法并不容易實現。

Actor 類有一個 final 方法 show()

public class Actor {
    public final void show() {

    }
}

當我們想要重寫該方法的話,就會出現編譯錯誤:

怎樣用Java final 關鍵字

如果一個類中的某些方法要被其他方法調用,則應考慮事被調用的方法稱為 final 方法,否則,重寫該方法會影響到調用方法的使用。

一個類是 final 的,和一個類不是 final,但它所有的方法都是 final 的,考慮一下,它們之間有什么區別?

我能想到的一點,就是前者不能被繼承,也就是說方法無法被重寫;后者呢,可以被繼承,然后追加一些非 final 的方法。沒毛病吧?看把我聰明的。

怎樣用Java final 關鍵字

03、final 變量

被 final 修飾的變量無法重新賦值。換句話說,final 變量一旦初始化,就無法更改。之前被一個小伙伴問過,什么是 effective final,什么是 final,這一點,我在之前的文章也有闡述過,所以這里再貼一下地址:

http://www.itwanger.com/java/2020/02/14/java-final-effectively.html

1)final 修飾的基本數據類型

來聲明一個 final 修飾的 int 類型的變量:

final int age = 18;

嘗試將它修改為 30,結果編譯器生氣了:

怎樣用Java final 關鍵字

2)final 修飾的引用類型

現在有一個普通的類 Pig,它有一個字段 name:

public class Pig {
   private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

在測試類中聲明一個 final 修飾的 Pig 對象:

 final Pig pig = new Pig();

如果嘗試將 pig 重新賦值的話,編譯器同樣會生氣:

怎樣用Java final 關鍵字

但我們仍然可以去修改 Pig 的字段值:

final Pig pig = new Pig();
pig.setName("特立獨行");
System.out.println(pig.getName()); // 特立獨行

3)final 修飾的字段

final 修飾的字段可以分為兩種,一種是 static 的,另外一種是沒有 static 的,就像下面這樣:

public class Pig {
   private final int age = 1;
   public static final double PRICE = 36.5;
}

非 static 的 final 字段必須有一個默認值,否則編譯器將會提醒沒有初始化:

怎樣用Java final 關鍵字

static 的 final 字段也叫常量,它的名字應該為大寫,可以在聲明的時候初始化,也可以通過 static [代碼塊初始化]()。

4) final 修飾的參數

final 關鍵字還可以修飾參數,它意味著參數在方法體內不能被再修改:

public class ArgFinalTest {
    public void arg(final int age) {
    }

    public void arg1(final String name) {
    }
}

如果嘗試去修改它的話,編譯器會提示以下錯誤:

怎樣用Java final 關鍵字

看完上述內容,你們掌握怎樣用Java final 關鍵字的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

敦煌市| 上思县| 鄂伦春自治旗| 恩平市| 曲水县| 永仁县| 封丘县| 正定县| 施甸县| 宁国市| 张掖市| 应城市| 买车| 霍山县| 长葛市| 中西区| 明溪县| 天全县| 游戏| 团风县| 岳阳县| 双流县| 吴堡县| 永寿县| 名山县| 湄潭县| 镇雄县| 柳州市| 福鼎市| 呼和浩特市| 翁牛特旗| 长春市| 延津县| 古田县| 陇南市| 通江县| 巴林右旗| 神木县| 黄浦区| 新和县| 牙克石市|