1. 程式人生 > >作為一個類,系統都會自動產生一個不帶引數的構造方法?

作為一個類,系統都會自動產生一個不帶引數的構造方法?

首先,這個問題的答案是:錯誤。

構造方法是用來建立一個例項的,或者說是建立一個物件。

如果類本身沒有寫構造方法,為了讓類能擁有面向物件的能力,那麼開發工具會預設新增一個"不可見的"構造方法,其實就是無參構造方法:

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();會在每個子類構造方法中都呼叫,即使你將子類新增一個構造方法,依舊會有那個異常。

解決辦法:

  1. 在父類中手動新增一個無參構造方法。
  2. 在子類建立一個構造方法,然後用super呼叫父類的構造方法。