Java final關鍵字

來源:互聯網
上載者:User

標籤:java

目錄

  • 目錄
  • final含義
  • final變數
  • final方法
  • final類
  • final關鍵字好處

final含義

final是Java中的一個保留關鍵字,可以聲明成員變數、方法和類。一旦你將引用聲明為final類型,你將不能再改變這個引用了。編譯器會檢查代碼,如果你試圖將變數再次初始化的話,編譯器會報編譯錯誤。

final變數

凡是對成員變數或者本地變數(在方法中的或者代碼塊中的變數稱為本地變數)聲明為final的都叫做final變數。下面是final修飾變數的例子:

final int constValue = 1;// constValue = 2; The final local variable constValue cannot be assigned.

補充點:

  1. final成員變數必須在聲明的時候初始化或者在建構函式中初始化,否則編譯器會報錯。
  2. 不能夠對final變數再次賦值。
  3. 在匿名類中所有變數都必須是final變數。
final方法

final也可以聲明方法。方法名前面加上final關鍵字,代表這個方法不可以被子類重寫。如果你認為一個方法的功能已經足夠完整了,子類中不需要改變該方法,你就可以將該方法聲明為final類型。
final聲明的方法比非final的方法快,因為在編譯的時候就已經靜態繫結了,不需要在運行時再動態綁定。下面是final方法的例子:

public class Person{    public final void printName() {        System.out.println("wangzhengyi");    }}
final類

使用final來修飾的類叫做final類。final類通常功能是完整的,它們不能被繼承。Java中許多類是final的,例如String類。

不可變類的一個好處就是它自身是安全執行緒的,你不需要考慮多線程環境下的安全執行緒問題。要建立不可變類,需要實現如下幾個步驟:

  1. 將類聲明為final,使它不能被繼承。
  2. 將所有的成員聲明為私人的,這樣就不允許直接存取這些成員。
  3. 對變數不要提供setter方法。
  4. 將所有可變的成員聲明為final,這樣只能對它們賦值一次。
  5. 通過構造器初始化所有成員,進行深拷貝(deep copy)。
  6. 在getter方法中,不要直接返回對象本身,而是複製對象,並返回對象的拷貝。

注意:淺拷貝和深拷貝的區別:

  1. 淺拷貝(淺複製):被複製對象的所有變數都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,只複製對象的基本類型,物件類型仍屬於原來的引用。
  2. 深拷貝(深複製):被複製的所有變數都含有與原來的對象相同的值,除去那些引用其他對象的變數。那些引用其他對象的變數將指向被複製過的新對象,而不再是原有的那些被引用的對象。換言之,不僅複製對象的基本類型,同時也複製原對象中的對象。

不可變類樣本:

import java.util.HashMap;import java.util.Iterator;public class FinalClassExample {    private final int id;    private final String name;    private final HashMap<Integer, String> hMap;    public int getId() {        return id;    }    public String getName() {        return name;    }    /**     * 可變對象的存取方法:返回對象的拷貝     * @return     */    public HashMap<Integer, String> gethMap() {        return (HashMap<Integer, String>)hMap.clone();    }    /**     * 實現深拷貝的構造器     */    public FinalClassExample(int id, String name, HashMap<Integer, String> map) {        this.id = id;        this.name = name;        HashMap<Integer, String> tMap = new HashMap<Integer, String>();        int key;        Iterator<Integer> iterator = map.keySet().iterator();        while (iterator.hasNext()) {            key = iterator.next();            tMap.put(key, map.get(key));        }        this.hMap = tMap;    }    /**     * 實現淺拷貝構造器     */    /*    public FinalClassExample(int id, String name, HashMap<Integer, String> map) {        this.id = id;        this.name = name;        this.hMap = map;    }    */}
final關鍵字好處

使用final關鍵字的優勢如下:

  1. final關鍵字提高了效能。JVM和Java應用都會緩衝final變數。
  2. final變數可以安全的在多線程環境下進行共用,而不需要額外的同步開銷。
  3. 使用final關鍵字,JVM會對方法、變數以及類進行最佳化。

Java final關鍵字

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.