繼承(Inheritance)-建構子(Constructor) 概念與實例

定義

 與類別同名,當我們創建物件(使用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              

    //....

}
  1. 父類別(Car),因為已經建立一個建構子了,所以並不會產生無參數的預設建構子(Car()),只有一個建構子。
  2. 子類別(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 () {  


    }

    //....

}
  1. 父類別(Car),因為已經建立一個建構子了,所以並不會產生無參數的預設建構子(Car()),只有一個建構子。
  2. 子類別(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();       

    }

    //....

}

  1. 父類別(Car),因為已經建立一個建構子了,所以並不會產生無參數的預設建構子(Car()),只有一個建構子。
  2. 子類別(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);       

    }

    //....

}

  1. 父類別(Car),因為已經建立一個建構子了,所以並不會產生無參數的預設建構子(Car()),只有一個建構子。
  2. 子類別(Demo),因為super(1458977)去找父類別(Car)對應的參數建構子,父類別有對應的參數建構子,編譯成功
-----------------------------------------------------------------------------------------------------------------------------------------------
class Car {

    string name

    int price            

    //....

}

class Demo extends Car {

    string name

    int price   

    public Demo () {  

    

    }

    //....

}

  1. 父類別(Car),因為沒有建構子,所以系統產生無參數的預設建構子(Car()),只有一個建構子。
  2. 子類別(Demo),建構子中沒有super(),系統會產生super(),並且因為super()去找父類別(Car)的無參數建構子,父類別有系統預設的無參數建構子,編譯成功
-----------------------------------------------------------------------------------------------------------------------------------------------
class Car {

    string name

    int price            

    //....

}

class Demo extends Car {

    string name

    int price               

    //....

}

  1. 父類別(Car),因為沒有建構子,所以系統產生無參數的預設建構子(Car()),只有一個建構子。
  2. 子類別(Demo),沒有建構子,也沒有super(),系統會產生無參數的預設建構子Demo()以及super(),並且因為super()去找父類別(Car)的無參數建構子,父類別有系統預設的無參數建構子編譯成功

留言