JavaSE-關鍵字final

final修飾數據:

  final修飾基本數據類型,使數值恆定不變,修飾對象引用,final使引用恆定不變java

  final修飾的成員變量必需要被初識化函數

  final能夠修飾方法中的參數列表,被修飾的參數沒法在方法中更改參數引用所指向的對象spa

  final和static修飾的成員變量表示常量線程

final修飾方法:

  final修飾方法的緣由有兩個,一是把方法鎖定,以防任何繼承類修改它的含義,確保在繼承中使方法行爲保持不變,對象

  而且不會被覆蓋;另外一緣由是效率。在早期java實現中,若是將方法指明爲final,就是贊成編譯器將針對該方法的排序

  全部調用都轉爲內嵌調用。如今的java虛擬機會自動探測到這種狀況,不須要經過final修飾方法而提升效率。繼承

  類中全部的private方法都隱式的指定爲是final的。內存

final修飾類:

  類被final修飾,代表該類不能被繼承(String就是final的)編譯器

final的內存語意:

  final域的重排序規則:虛擬機

    對於final域,編譯器和處理器要遵照兩個重排序規則

    (1) 在構造函數內對一個final域的寫入,與隨後把這個被構造對象的引用賦值給一個引用變量,這兩個操做之間不能重排序。

    (2)初次讀一個包含final域的對象的引用,與隨後初次讀這個final域,這兩個操做之間不能重排序。

  寫final域的重排序規則:

    寫final域的重排序規則禁止把final域的寫重排序到構造函數以外。這個規則包含兩個方面:

    (1)JMM禁止編譯器把final域的寫重排序到構造函數以外。

    (2)編譯器會在final域的寫以後,構造函數returen以前,插入一個StoreStore屏障。這個屏障禁止處理器把final域的寫重排序

     到構造函數以外。

  讀final域的重排序規則:

    讀final域的重排序規則是,在一個線程中,初次讀對象引用與初次讀該對象包含的final域,JMM禁止處理器重排序這兩個操做

    (這個規則僅針對處理器)。編譯器會在讀final域操做的前面插入一個LoadLoad屏障。

  final域爲引用類型:

    上面講到的都是基礎數據類型,那麼對於引用類型是怎樣的呢?對於引用類型,寫final域的重排序規則對編譯器和處理器增長

    了以下約束:在構造函數內對一個final引用的對象的成員域的寫入,與隨後在構造函數外吧這個被構造對象的引用賦值給一個

    引用變量,這兩個操做之間不能重排序。

相關文章
相關標籤/搜索