Java Final關鍵字

讓蛋蛋飛發表於2018-04-05

final關鍵字的使用

1.修飾類

表明這個類不能被繼承,類中所有成員方法都會被隱式地指定為final方法,比如:String類,Integer及其他包裝類

2.修飾方法

表明該方法不能被子類重寫

3.修飾變數

如果final修飾基本資料型別的變數,其數值一旦初始化後不能被修改。

如果final修飾引用型別的變數,初始化後不能再讓其指向另一個物件,但引用型別變數指向的物件的內容是可變的。

例如:

class Person {
    public int age = 0
}
final Person person = new Person();
person.age = 20; // 引用變數的內容是可變的
複製程式碼

如果final修飾成員變數時,成員變數必須在定義時或者構造器中進行初始化賦值,初始化賦值後不能被修改。

如果final修飾本地變數(方法中或程式碼塊中的變數為本地變數)時,本地變數必須在宣告時賦值,初始化賦值後不能被修改。

final關鍵字的優點

  1. final關鍵字提高了效能,JVM和Java應用都會快取final變數

  2. final變數可以安全的在多執行緒環境下進行共享,而不需要額外的同步開銷。

  3. 使用final關鍵字,JVM會對方法、變數及類進行優化。

    例如:

    final String name = "Tom";
    複製程式碼

    編譯器在編譯期間知道確切值,把它當做編譯器常量使用,即在用到該final變數的地方,相當於直接訪問這個常量,不需要在執行時確定。

    final String name = getName();
    複製程式碼

    編譯器在編譯期間不知道確切值,就不會做優化處理。

final關鍵字的注意點

  1. 介面中宣告的所有變數本身都是final的。

  2. 在匿名類中所有變數都必須是final變數。

  3. final和abstract這兩個關鍵字是反相關的,final類不可能是abstract的

  4. 對於集合物件宣告為final,其引用不能被更改,但是可以向其中增加、刪除或改變內容。

    例如:

    private final List<Person> persons = new ArrayList<Person>();
    persons.add("Tom");
    persons.add("Jack");
    //persons = new Vector(); --- 引用不能被更改
    複製程式碼
  5. 將類、方法、變數宣告為final能夠提高效能、這樣JVM就有機會進行估計,然後優化。

  6. static修飾成員變數表示只儲存一份副本,final修飾成員變數用來保證變數不可變。

  7. final方法在編譯階段繫結,稱為靜態繫結。

相關文章