1. 程式人生 > >Java中static和final的區別

Java中static和final的區別

static是靜態修飾關鍵字,可以修飾變數和程式塊以及類方法:

當定義一個static的變數的時候jvm會將將其分配在記憶體堆上,所有程式對它的引用都會指向這一個地址而不會重新分配記憶體;

當修飾一個程式塊的時候(也就是直接將程式碼寫在static{...}中)時候,虛擬機器就會優先載入靜態塊中程式碼,這主要用於系統初始化;

當修飾一個類方法時候你就可以直接通過類來呼叫而不需要新建物件。

final可以修飾變數、方法及類:

當定義一個final變數時,jvm會將其分配到常量池中,程式不可改變其值;

當修飾一個方法時,該方法在子類中將不能被重寫;

當修飾一個類時,該類不能被繼承。

  1. static變數

按照是否靜態的對類成員變數進行分類可分兩種:一種是被static修飾的變數,叫靜態變數或類變數;另一種是沒有被static修飾的變數,叫例項變數。兩者的區別是:

對於靜態變數在記憶體中只有一個拷貝(節省記憶體),JVM只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(方便),當然也可以通過物件來訪問(但是這是不推薦的)。對於例項變數,沒建立一個例項,就會為例項變數分配一次記憶體,例項變數可以在記憶體中有多個拷貝,互不影響(靈活)。

  2.  static方法

靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫,因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的例項變數和例項方法(就是不帶static的成員變數和成員成員方法),只能訪問所屬類的靜態成員變數和成員方法。因為static方法獨立於任何例項,因此static方法必須被實現,而不能是抽象的abstract。