定義
與類別同名,當我們創建物件(使用new時),就執行的動作,主要功能為初始化(讓某些變數於一開始就帶有某些值),而且支援過載(overload),因此可以依需求使用某一參數版本的建構子。
使用條件與方法
必須與類別名相同
沒有回傳值
沒有void
不能使用static 、final ,但是可為public、private、protected
可以過載(Overload),及允許多個相同名稱的method,會自動按照參數個數及類型來自動對應
若類別沒有建構子,系統會自動加上沒有參數的建構子 ,反之則不會產生預設的建構子
同一類別內的建構子可以使用this,互相呼叫
建構子不會被繼承,但是子類別可以用super呼叫父類別的建構子
在繼承(Inheritance),若子類別建構子的第一行沒有super,系統會自動加上super() ,將會自動尋找父類別的無參數建構子,假使父類別沒有無參數建構子,編譯將會出錯,若已知父類別沒有無參數建構子,可以在super(),填入父類別帶有參數的建構子,讓系統找到正確的建構子
this跟super不能同時存在,而且一定要寫在建構子的最前面
實例
簡單例子
class Car { string name int price //必須與類別名稱相同,若當您有自己加上建構子後,就只能使用類別所擁有的建構子來建立物件 //因此建議當您自己定義自己的建構子時,至少也加上沒有參數的建構子,讓別人至少可以使用Car Audi = new Car() public Car (string name ,int price) { this.name = name; this.price = price; //.... //不能含有return } //可以過載(Overload) public Car (int price) { this.price = price;//or this("i-5",price) //可以使用this呼叫其他的同類別的建構子替代寫法,this("i-5",price)是呼叫Car (string name ,int price) //.... //不能含有return } //若當你定義一個類別,但沒有定義建構子時,系統會自動幫您產生沒有參數的建構子如下 public Car () { //.... //不能含有return } //.... } class Dealer{ public static void main(String[] args) { //會自動按參數個數及類型對應 Car Bmw = new Car ("i-5", 7000000); Car Audi = new Car (1420000); Car Toyota = new Car (); } //.... }繼承-建構子-super 例子
class Car { string name int price public Car(string name ,int price){ this.name = name; this.price = price; } //.... } class Demo extends Car{ string name int price //.... }
- 父類別(Car),因為已經建立一個建構子了,所以並不會產生無參數的預設建構子(Car()),只有一個建構子。
- 子類別(Demo),沒有建構子,也沒有super(),系統會產生無參數的預設建構子Demo()以及super(),並且因為super()去找父類別(Car)的無參數建構子,父類別沒有無參數建構子,編譯錯誤。
-----------------------------------------------------------------------------------------------------------------------------------------------
class Car { string name int price public Car (string name ,int price) { this.name = name; this.price = price; } //.... } class Demo extends Car { string name int price public Demo () { } //.... }
- 父類別(Car),因為已經建立一個建構子了,所以並不會產生無參數的預設建構子(Car()),只有一個建構子。
- 子類別(Demo),建構子中沒有super(),系統會產生super(),並且因為super()去找父類別(Car)的無參數建構子,父類別沒有無參數建構子,編譯錯誤。
-----------------------------------------------------------------------------------------------------------------------------------------------
class Car { string name int price public Car (string name ,int price) { this.name = name; this.price = price; } //.... } class Demo extends Car { string name int price public Demo () { super(); } //.... }
- 父類別(Car),因為已經建立一個建構子了,所以並不會產生無參數的預設建構子(Car()),只有一個建構子。
- 子類別(Demo),因為super()去找父類別(Car)的無參數建構子,父類別沒有無參數建構子,編譯錯誤。
-----------------------------------------------------------------------------------------------------------------------------------------------
class Car { string name int price public Car (int price) { this.price = price; } //.... } class Demo extends Car { string name int price public Demo () { super(1458977); } //.... }
- 父類別(Car),因為已經建立一個建構子了,所以並不會產生無參數的預設建構子(Car()),只有一個建構子。
- 子類別(Demo),因為super(1458977)去找父類別(Car)對應的參數建構子,父類別有對應的參數建構子,編譯成功。
-----------------------------------------------------------------------------------------------------------------------------------------------
class Car { string name int price //.... } class Demo extends Car { string name int price public Demo () { } //.... }
- 父類別(Car),因為沒有建構子,所以系統產生無參數的預設建構子(Car()),只有一個建構子。
- 子類別(Demo),建構子中沒有super(),系統會產生super(),並且因為super()去找父類別(Car)的無參數建構子,父類別有系統預設的無參數建構子,編譯成功。
-----------------------------------------------------------------------------------------------------------------------------------------------
class Car { string name int price //.... } class Demo extends Car { string name int price //.... }
- 父類別(Car),因為沒有建構子,所以系統產生無參數的預設建構子(Car()),只有一個建構子。
- 子類別(Demo),沒有建構子,也沒有super(),系統會產生無參數的預設建構子Demo()以及super(),並且因為super()去找父類別(Car)的無參數建構子,父類別有系統預設的無參數建構子,編譯成功。
留言
張貼留言