Java基本語法之構造方法

1、what
什麼是構造方法?它長的如下:
public Apple() {}

因爲本質上也是方法,所以要遵循方法的語法,即方法名,圓括號,花括號。圓括號內有參數列表,花括號內是方法體。方法名前面可以被訪問修飾符修飾。但是構造方法最特殊的地方在於,它不需要返回類型,這並不是說,它的返回類型是void,而是根本沒有。另外,它的名字必須和類名保持一致。


2、why
幹嘛要弄這麼個特殊的方法呢?官方的說法是爲了保證類字段(數據成員或屬性)的初始化。可以在構造方法內部對類的屬性變量賦值,保證它們在被使用之前已經被恰當的初始化。
但是,初始化類字段完全可以使用任意一個方法,一定要用構造方法嗎?答案是否定的。我們完全可以在類中隨便寫一個方法,並在這個方法中初始化類字段。然而這需要我們自己去保證,每次創建完對象都回去調用這個自己寫的方法。這就呵呵了,顯然可操作性不強,估計沒人能一直記得做這件事。而類字段的初始化又是很重要的,所以Java的設計者們就想了構造方法這個點子。
假設沒有構造方法,創建對象可能是這樣的:
Apple apple = new Apple;
apple.initialize();
但是自從有了構造方法,就成了這樣:
Apple apple = new Apple();
直接在類名後面加了個圓括號,一舉兩得:既指明瞭類的名稱,又調用了初始化方法。壞處就是顯得不倫不類:new後面怎麼跟了個方法,不應該是個類嗎?這也是構造方法的名稱必須要和類名保持一致的原因,創建對象必須指明是哪個類,同時還得調用構造方法,那乾脆用類名做構造方法名好了,起別的名字人家怎麼知道是哪個類?

這樣一來,調用構造方法就是在創建對象,而創建對象同時也調用了構造方法,二者達到了高度的合體~媽媽再也不會擔心我忘記初始化了。第一個想到這個點子的人請收下我的膝蓋。


3、how
構造方法裏面只能寫給類字段賦值的語句嗎?可以寫別的。但是從設計的角度,如果功能很多,還是另寫一個方法較好。
構造方法可以不寫嗎?可以。如果不寫,編譯器會幫你自動生成一個默認的,就是參數列表和方法體都是空的那種。不寫就代表你沒有初始化需求,從而創建對象的時候只能使用不帶參數的構造方法。
構造方法可以重載嗎?可以。一個類中可以有多個構造方法,它們的參數列表不同。

關於默認構造函數,需要多說幾句。假如你實現了任意一個構造方法,那麼編輯器就不再爲你添加默認的構造方法。於是你在創建對象時,必須按照你的構造方法的格式去傳入參數。比如,你的類只有一個下面的構造方法:
public Apple(String s) {}
那麼這樣創建對象是不行的:
Apple apple = new Apple();

4、more
綜上我們可以知道,要創建對象,必須得調用構造方法。但是如果我們用private來修飾構造方法,是不是就不能再創建這個類的對象了呢?這個問題要分情況回答。可以肯定的一點是,在類外顯然不能再使用new這種方式來創建該類對象,因爲別人(和你)不能在類外調用構造方法。
那如何才能讓別人獲取到該類對象呢?注意,private只是限制類成員不能在類外訪問,但是在類內還是可以繼續訪問的。所以我們可以在類內的任一個方法內部調用構造方法產生該類對象並返回。這樣一來還是不行,因爲這個方法無法被訪問到,畢竟有了對象才能調用方法。於是答案就出來,把這個方法聲明爲static的,就可以直接通過類名來調用。搞定~

5、父類的構造方法
Java中任意一個類必然會存在繼承,至少繼承了根類Object。那麼子類和父類的構造方法有什麼關係?關係就是,調用子類的構造方法之前,必然先調用了父類的構造方法。因爲類的初始化順序決定了父類的初始化先於子類。一般情況下,父類的構造器會被自動調用,不必寫顯式的代碼。但是如果出於某種考慮需要顯式調用父類的構造方法時,需要保證這個調用語句是子類構造方法的第一行代碼。只有這樣父類的初始化才能在子類之前。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章