為什麼要有無參構造方法
無參構造器也叫無參構造方法,在我們建立類時候,可以不用寫構造方法,因為系統會預設給我們提供一個無參構造方法,如果我們自己寫了無參構造方法,那麼我們這個就將預設的覆蓋了。那麼為什麼一定要有這麼一個無參構造方法呢?
1、因為我們在例項物件的時候,都要不斷的向上(父類)回溯,回溯到Object(),要想順利的回溯到Object,就必須給指定一條通路,如果沒有,就用預設的 super()。
下面是我的一個測試,共有 GrandPa、Father和Son 3個類,
我現在在 main方法裡 執行這條語句。Son son = new Son(); 控制檯的輸出結果如下:
由結果可知,一定不斷的回溯到了Object,只不過是沒有列印語句而已。若我們不指定呼叫父類的哪個構造方法。就會呼叫預設的無參構造方法,當然這個呼叫語句是在方法體的第一行。
如上上圖所示,加不加 super()結果是一樣的,因為預設有這一行。
2、那我把父類的無參構造方法去了還能回溯嗎?當然可以,因為會預設有一個。 把Father的無參構造方法註釋掉,控制檯輸出如下:我是爺爺的無參構造器
我是孩子的無參構造器
3、如果我的父類沒有提供無參構造方法,但是提供了 有參構造方法,結果會如何?
子類直接出現編譯錯誤,錯誤提示是: 在父親類那裡沒有找到預設的構造器。 說明:如果父類沒有提供預設的構造方法,而只是提供了有參構造方法,子類在繼承時候,就會出錯。
錯誤的原因是:編譯器看到我們在Father類裡寫了有參構造法方法,它就會認為,我們不想讓子類在回溯的時候走 預設構造方法這條路【super(); 此路不通】,但是我們又沒告訴給子類,它應該走哪條路,所以會報錯。 所以,若父類沒有提供無參構造方法,但是提供了 有參構造方法,就要在子類的無參構造方法裡,顯示的加上呼叫父類的有參構造方法語句。 如下:super(1);
控制檯輸出語句如下:
我是爺爺的無參構造器
我是父親的有參構造器
我是孩子的無參構造器
證明,子類找到了回溯的路!
啟示:在以後的Java開發中,若一個POJO類要有帶參構造方法,要記得先寫無參構造方法。