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.什麼時候定義靜態函數/靜態變量?
當對象中出現共享數據時,該數據被靜態所修飾。(對象中的特有數據要定義成非靜態存在於堆內存中)
當功能內部沒有訪問到非靜態數據(對象的特有數據),那麼該功能可以定義爲靜態的。