天天看點

Java修飾符歸納

[color=red]final[/color]

1.final類

final類不能被繼承,是以final類的成員方法沒有機會被覆寫,預設都是final的。在設計類時候,如果這個類不需要有子類,确信這個類不會載被擴充,那麼就定義為final類。

2.final方法

如果一個類不允許其子類覆寫某個方法,則可以把這個方法聲明為final方法。final不能用于修飾構造方法。父類的private成員方法是不能被子類方法覆寫的,是以private類型的方法預設是final類型的。基本目的可以歸納為:

a.鎖定方法,防止任何繼承類修改它的意義和實作。

b.執行效率高。編譯器在遇到調用final方法時候會轉入内嵌機制,執行效率提高很大。

3.final變量

用final修飾的成員變量表示常量,一旦給final變量初值後,值就不能再改變了。這裡不可改變的意思對基本類型來說是其值不可變,而對于對象變量來說其引用不可再變。其初始化可以在兩個地方,一是其定義處,也就是說在final變量定義時直接給其指派,二是在構造函數中。這兩個地方隻能選其一。

final修飾的變量有三種:靜态變量、執行個體變量和局部變量,分别表示三種類型的常量。

final變量定義的時候,可以先聲明,而不賦初值,這種變量也稱為blank final,編譯器會確定blank final在使用之前必須被初始化。這樣一個類中的final資料成員就可以實作依對象而有所不同,卻有保持其恒定不變的特征。

4.final參數

當方法形參為final類型時,改參數就是隻讀的。其中嵌套類中使用的外部資料都是final類型的。

[color=red]static[/color]

1.static方法

在一個類中定義一個方法為static,無需本類的執行個體對象即可調用此方法,當然任何的執行個體也可以調用。靜态方法中不能用this和super關鍵字,不能直接通路所屬類的執行個體變量和執行個體方法(就是不帶static的成員變量和成員成員方法),隻能通路所屬類的靜态成員變量和成員方法。

一般來說,靜态方法常常出現在utils或者helper類中。static方法獨立于任何執行個體,是以static方法必須被實作,而不能abstract。

2.static變量

所有此類執行個體共享此static變量,也就是說在類裝載時,隻配置設定一塊存儲空間,所有此類的對象都可以操控此塊存儲空間.

java變量可分兩種:一種是被static修飾的變量,叫靜态變量或類變量;另一種是沒有被static修飾的變量,叫執行個體變量。兩者的差別是:

對于靜态變量在記憶體中隻有一個拷貝(節省記憶體),JVM隻為靜态配置設定一次記憶體,在加載類的過程中完成靜态變量的記憶體配置設定,可用類名直接通路,當然也可以通過對象來通路,但是不推薦。

對于執行個體變量,沒建立一個執行個體,就會為執行個體變量配置設定一次記憶體,執行個體變量可以在記憶體中有多個拷貝,互不影響。

3.static代碼塊

用static修飾的代碼塊表示靜态代碼塊,是在類中獨立于類成員的static語句塊,可以有多個,位置可以随便放,它不在任何的方法體内,當JVM加載類時,就會執行該代碼塊,如果static代碼塊有多個,JVM将按照它們在類中出現的先後順序依次執行它們,每個代碼塊隻會被執行一次。

[color=red]transient[/color]

如果用transient聲明一個執行個體變量,當對象被序列化的時候,它不會被序列化。

[color=red]volatile[/color]

volatile告訴編譯器被volatile修飾的變量可以被程式的其他部分改變。在多線程程式中,有時兩個或更多的線程共享一個相同的執行個體變量。考慮效率問題,每個線程可以自己儲存該共享變量的私有拷貝。實際的變量副本在不同的時候更新,如當進入synchronized方法時.

volatile隻能用于原子方式(atomic)對變量的操作上,也就是通路改變量的method隻能單一的load或者存儲,如果該method有其他的程式代碼,這些程式代碼在操作過程中不能夠以該變量來改變它的值。eg,++、--操作就不能用于volatile變量,因為它包含了載入,計算,存儲三個步驟。

要注意,對一個數組聲明為volatile,隻是讓數組的引用是volatile,數組中的元素并不是volatile。

[color=red]strictfp[/color]

在Java虛拟機進行浮點運算時,如果沒有指定strictfp關鍵字時,Java的編譯器以及運作環境在對浮點運算得到的結果往往無法令你滿意。而一旦使用了strictfp來聲明一個類、接口或者方法時,那麼所聲明的範圍内Java的編譯器以及運作環境會完全依照浮點規範IEEE-754來執行。是以如果你想讓你的浮點運算更加精确,而且不會因為不同的硬體平台所執行的結果不一緻的話,那就請用關鍵字strictfp。

你可以将一個類、接口以及方法聲明為strictfp,但是不允許對接口中的方法以及構造函數聲明strictfp關鍵字。一個類被聲明為strictfp,那麼該類中所有的方法都是strictfp的。

[color=red]native[/color]

與操作平台相關,隻定義方法而不實作,方法的實作被一個外部的庫實作。一般用于JNI調用。