作為一個類,系統都會自動產生一個不帶引數的構造方法?
阿新 • • 發佈:2019-01-04
首先,這個問題的答案是:錯誤。
構造方法是用來建立一個例項的,或者說是建立一個物件。
如果類本身沒有寫構造方法,為了讓類能擁有面向物件的能力,那麼開發工具會預設新增一個"不可見的"構造方法,其實就是無參構造方法:
class Car { public void color() { System.out.print("I have color!"); } } public class Test1{ public static void main(String[] args) { Car car=new Car(); //呼叫自動產生的無參構造方法 car.color(); } }
結果為:
I have color!
但是,如果類本身建立了一個構造方法,那麼系統將不會再為他建立無參構造方法。
在有構造方法的時候:
所以,在有構造方法的時候,系統不會再生成無參構造法,如果你想要,需要自己去建立。一般情況為了防止錯誤發生,類最好建立一個無參構造,原因下面會講。class Car { int length; Car(int length) { this.length=length; } public void color() { System.out.print("I have color!"); } } public class Test1{ public static void main(String[] args) { Car car=new Car(); //會報錯:The constructor Car() is undefined 即:該Car()構造法沒有被定義 car.color(); } }
class Car //父類 { int length; Car(int length) { this.length=length; } public void color() { System.out.print("I have color!"); } } class BMW extends Car //子類,該行出現異常:Implicit super constructor Car() is undefined for default constructor. Must define an explicit constructor { //原因:找不到父類的Car()構造方法。 } public class Test1{ public static void main(String[] args) { BMW car=new BMW(); car.color(); } }
異常原因:因為BMW沒有構造方法,所以是預設無參構造,即
BMW()
{
super();
}
其中super();是繼承父類的無參構造,也是"不可視"的。super();會在每個子類構造方法中都呼叫,即使你將子類新增一個構造方法,依舊會有那個異常。
解決辦法:
- 在父類中手動新增一個無參構造方法。
- 在子類建立一個構造方法,然後用super呼叫父類的構造方法。