Java中final和static的區別

1.final和static變量:

  1.1. final只能在類中定義時或者在構造器中進行初始化,且只能使用一種方法,屬於對象。不同對象可以有不同的值,一旦賦值之後則不允許修改。  static可在類中定義、構造器、或者通過類名.變量名(對象.變量名)的方式賦值,即可以修改,但修改後所有對象對應的該變量值均相等。二者都在靜態存儲區。

final修飾的類屬性(Field)、實例屬性、局部屬性能指定初始值的地方:

1)類屬性:必須在類的靜態初始化塊或聲明該屬性時指定初始值。

2)實例屬性:必須在非靜態初始化塊、聲明該屬性或構造器中指定初始值。

3)局部屬性:局部變量中的屬性必須由程序員顯示初始化,形參中的final屬性不能修改其值。

1.2. 當final修飾引用類型變量時,該引用的對象所引用的地址不可變,即一直指向同一個對象,但該對象中的屬性內容可以改變。

static只能修飾類屬性或方法。

1.3. 可執行“宏替換”的final變量

條件:1)使用final修飾

           2)在定義時指定了初始值。

           3)該初始值在編譯時就可確定下來。

例如:1)在方法中定義

          final int a=5;//即可作爲宏替換使用。

          2)若被賦值的表達式只是基本算術表達式或者字符串連接,沒有訪問普通變量或者調用方法,則同樣可作爲宏替換使用。如:

          final string s1="zhang"+88;//可直接將s1認爲是“zhang88”,即s1=="zhang88";

          final string s2="zhang"+String.valueOf(88);//調用了String的valueOf()方法,不能將s2作爲宏替換。若使用==,則時s2!="zhang88"。

2.方法:

  fianl:不允許其子類覆蓋該方法。

  static:只能訪問所屬類的static成員變量和成員方法以及一些基本數據類型變量。private成員都隱式地指定爲final,即不讓子類訪問。

3.修飾類時:

  final:說明不能定義該類的子類。因爲此時默認的成員方法全爲final

  static:不能修飾外部類,但可以定義靜態內部類,可以把一個類隱藏在另一個類的內部,以便取消賦值時產生的引用。

4.什麼時候定義靜態函數/靜態變量?

  當對象中出現共享數據時,該數據被靜態所修飾。(對象中的特有數據要定義成非靜態存在於堆內存中)

  當功能內部沒有訪問到非靜態數據(對象的特有數據),那麼該功能可以定義爲靜態的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章