一、java final的使用時機及定義
Java關鍵字final有「這是無法改變的」含義,它可以修飾非抽象類別、非抽象類別成員方法和變數。你可能出於兩種理解而需要阻止改變:設計或效率。
- final類別不能被繼承,一定沒有子類別,final類中的方法預設是final的
- final方法不能被子類別的方法覆蓋(override ),但可以被繼承
- final成員變數表示常數(const),只能被設定值一次,設定值後值永遠不能再改變
- final不能用於修飾建構方法(construction)
1、final類別
final類別不能被繼承,因此final類別的成員方法不可能被覆蓋(override),預設都是final的。在設計類別時,如果這個類別不需要有子類別,類別的實現細節不允許改變,並且確定這個類別不會被擴展(extends),那麼就設計為final類別。2、final方法
如果一個類別不允許其子類別覆蓋(override)某個方法,則可以把這個方法宣告為final方法。使用final方法的原因有二:- 把方法鎖定防止任何繼承類別修改它的意義和實現過程
- 高效能,編譯器在遇到宣告成final方法的時候會轉入內嵌機制,大大提高執行效率
3、final變數(常數const)
用final修飾的成員變數表示常數,值一旦給定就無法改變!final修飾的變量有三種:
- 靜態變數(static final)
- 實例變數
- 區域變數
4、final參考
當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。二、java static的使用時機及定義
static表示「全域」或者「靜態」的意思,用來修飾成員變數和成員方法,也可以形成靜態static程式碼。 被static修飾的成員變數和成員方法獨立於該類別的任何對象。也就是說,它不依賴類特定的實例物件,被類別的所有物件實體共享。只要這個類別被加載,Java虛擬機器就能根據類別名稱在執行時數據區的方法區內定找到他們。因此,static對象可以在它的任何物件創建之前存取,無需引用任何物件。用public修飾的static成員變數和成員方法本質是全域變數和全域方法,當宣告它類別的對象是不生成static變數的副本,而是類別的所有物件實體共用同一個static變數。 static變數前可以有private修飾,表示這個變數可以在類別的靜態程式代碼中,或者類別的其他靜態成員方法中使用(當然也可以在非靜態成員方法中使用--廢話),但是不能在其他類別中通過類別名稱來直接引用,這一點很重要。實際上你需要搞明白,private是訪問權限限定,static表示不用產生物件實體就可以使用,這樣就容易理解多了。static前面加上其它訪問權限關鍵字的效果也以此類推。 static修飾的成員變數和成員方法習慣上稱為靜態變數和靜態方法,可以直接通過類別名稱來存取。用static修飾的程式碼表示靜態程式碼,當Java虛擬機(JVM)加載類時,就會執行該程式碼。
1、static靜態變數
按照是否靜態的對類別成員變數進行分類可分兩種:- 一種是被static修飾的變數叫靜態變數或類變數
- 另一種是沒有被static修飾的變數叫實例變數
- 對於靜態變數在記憶體中只有一個副本(節省空間),JVM只為靜態分配一次記憶體,在加載類別的過程中完成靜態變數的記憶體分配,可用類別名稱直接存取(方便),當然也可以通過物件來訪問(但是這是不推薦的)
- 對於實例變數,每創建一個變數實體,就會為變數重新分配一次記憶體,實例變數可以在記憶體中有多個副本,互不影響(靈活)
2、static靜態方法
靜態方法可以直接通過類別名稱存取,任何的物件也都可以使用,因此靜態方法中不能用this和super關鍵字,不能直接存取所屬類別的實例變數和實例方法(就是不帶static的成員變數和成員方法),只能存取所屬類別的靜態成員變數和成員方法。因為實例成員與特定的對象關聯!這個需要去理解,去想明白其中的道理,不是死背!!!
因為static方法獨立於任何實例,因此static方法必須被實現,而不能是抽象的abstract。3、static靜態程式碼
static程式碼也叫靜態程式碼,是在類別中獨立於類別成員的static語法,可以有多個,位置可以隨便放,它不允許在任何的方法內,JVM加載類別時會執行這些靜態的程式碼,如果static程式碼有多個,JVM將按照它們在類別中出現的先後順序依次執行它們,每個靜態程式碼只會被執行一次。例如:class rr
{
private final static String str="專屬的私人靜態常數(雷同全域變數)";
static
{
System.out.println("第一個靜態程式碼(只能寫在類別內,不可以寫在方法內)");
}
public static void main(String[] args)
{
System.out.println(str);
}
static
{
System.out.println("第二個靜態程式碼(還是會比println(str)早執行)");
}
}

沒有留言 :
張貼留言