格式化

廣告

廣告2

2012年11月17日 星期六

[JAVA基本概念] final跟static正確的使用方法

JAVA中final跟static正確的使用方法


一、java final的使用時機及定義
Java關鍵字final有「這是無法改變的」含義,它可以修飾非抽象類別非抽象類別成員方法變數。你可能出於兩種理解而需要阻止改變:設計或效率。
  • final類別不能被繼承,一定沒有子類別,final類中的方法預設是final的
  • final方法不能被子類別的方法覆蓋(override ),但可以被繼承
  • final成員變數表示常數(const),只能被設定值一次,設定值後值永遠不能再改變
  • final不能用於修飾建構方法(construction)
注意:父類別的private成員方法是不能被子類別的方法覆蓋的,因為private類型的方法預設是final類型的。

1、final類別

final類別不能被繼承,因此final類別的成員方法不可能被覆蓋(override),預設都是final的。在設計類別時,如果這個類別不需要有子類別,類別的實現細節不允許改變,並且確定這個類別不會被擴展(extends),那麼就設計為final類別。

2、final方法

如果一個類別不允許其子類別覆蓋(override)某個方法,則可以把這個方法宣告為final方法。使用final方法的原因有二:
  1. 把方法鎖定防止任何繼承類別修改它的意義和實現過程
  2. 高效能,編譯器在遇到宣告成final方法的時候會轉入內嵌機制,大大提高執行效率

3、final變數(常數const)

用final修飾的成員變數表示常數,值一旦給定就無法改變!
final修飾的變量有三種:

  1. 靜態變數(static final)
  2. 實例變數
  3. 區域變數
另外,final變數定義的時候,可以先宣告,而不給初值,這中變數也稱為final空白,無論什麼情況,編譯器都確保空白final在使用之前必須被初始化。但是,final空白在final關鍵字final的使用上提供了更大的靈活性,為此,一個類別中的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)早執行)");
 }
}

沒有留言 :