final 實例域
將實例域定義爲final意味着構建對象時必須初始化它,即構造器執行後這個域必須有值,且後續不可以進行修改。
final修飾符大都用於基本類型域或不可變類(類中的每個方法都不會修改對象,例如String類)的域。
對於可變類,使用final僅僅表示變量對於對象的引用不會發生變化,但是對象可以調用自己的方法來改變,從而容易產生混淆。
static 靜態域和靜態方法
在絕大多數面向對象程序設計語言中,靜態域被稱爲類域。static只是沿用了C++的叫法,沒有實際意義。
靜態域(靜態變量)
每個類中只可以有一個這樣的域的實例(就是說,所有的對象共享一個靜態域)。
靜態變量可以直接獲得,比如Employee.numOfEMP
。
靜態常量
常量名全大寫
定義的靜態常量可以直接獲得,比如Math.PI
可以獲得靜態常量PI的值。
靜態常量可以設計爲public,因爲沒有對象可以修改它。
靜態方法
靜態方法是一種不能向對象實施操作的方法,也即沒有隱式的參數。
隱式參數和顯式參數
顯式參數也即括號中的參數,隱式參數爲調用方法的對象。
比如,
AProject.getSth(a,b)
,a,b是顯式參數,AProject是隱式參數。
靜態方法直接使用類名.方法名
來調用(實際上,也可以通過對象名.方法名
來調用,但實際上和對象毫無關係,容易造成混淆)。
兩種情況使用靜態方法:
1. 方法不需要對象的狀態,所需參數全部爲顯式參數提供。
2. 方法只需要訪問類的靜態域,例如Emplyoyee.getNextId
,即靜態域。
靜態方法的另一個應用:工廠方法
工廠方法,即使用靜態方法來構造對象。
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
currencyFoematter.format(10);
使用靜態方法而不是構造器的原因:
1. 無法命名構造器。而靜態方法可以有不同的名字。
2. 使用構造器無法改變所構造的對象類型,而靜態方法可以返回不同的對象,比如子類。
另一個常見的靜態方法:main方法
每一個類都可以有一個main方法,這是常用於單元測試的技巧。
可以在所有需要進行單元測試的類添加main方法,執行的時候可以選擇執行哪一個main。