iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0
自我挑戰組

Java SE系列 第 6

Day06:爸爸這麼做都是為你好

當我們在定義類別時,有三種東西可以定義,屬性(field)、建構子(constructor)、方法(method)。今天要來談談建構子,建構子有些需要刻意注意的潛規則。

  1. 預設建構子(Default Constructor)
    假設我們今天定義了一個Player的類別:
class Player{
    String name;
    int age;
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return this.age;
    }
}

看似我們只定義了屬性跟方法,但實際上Java會存在一個預設的空建構子:

Player(){

}

有趣的是,若類別有父類別,則子類別的建構子會**隱藏的呼叫父類別的預設建構子;若父類別沒有預設建構子時,子類別除了必須自行定義建構子外,還必須在建構子講明要呼叫哪個父類別建構子。**那為什麼會沒有預設建構子?因為只要我們建立了自行定義的建構子,Java就不會幫我們建立預設的空建構子了。

  1. 自行定義建構子
    若在Player類別中我們自己定義了一個可以傳入name建立Player實例的建構子:
class Player{
    String name;
    int age;
    
    Player(String name){
        this.name = name;
    }
    
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return this.age;
    }
}

這樣的話,在程式中要new出這個類別的實例時,都必須透過這個傳入name引數的建構子了!無法new Player()這樣不傳入參數創建Player實例。而且當有類別繼承Player時,該子類別的建構子就必須寫出要如何呼叫出這個父類別的建構子(必須寫在子類別建構子的第一行,ex: super(name);)。聽起來頗麻煩的對不對?能不能有自行定義的建構子,同時也可以讓子類別的建構子不特別指定父類別建構子,或者可以不自行定義建構子?

  1. 自行定義的空建構子(Nullary Constructor)
    答案其實很簡單暴力,那就是自己定義一個空的建構子~
class Player{
    String name;
    int age;
    
    Player(){
    }
        
    Player(String name){
        this.name = name;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return this.age;
    }
}

這樣一來,繼承Player的子類別就可以達到不需撰寫任何建構子的目的了。

小結:

  1. 若類別沒有定義任何建構子,Java會隱含一個預設建構子(Default Constructor)
  2. 當我們自行撰寫了任何形式的建構子後,預設建構子就不存在了,且子類別也必須定義出建構子,並在子類別建構子的第一行定義要呼叫哪個父類別建構子
  3. 若我們希望子類別可以不用撰寫任何建構子,或者子類別的建構子不用特別定義如何呼叫父類別建構子,那只要在父類別中自行定義出空建構子(Nullary Constructor),Java就會自動在子類別建構子中隱含呼叫這個空建構子
  4. 本質上,預設建構子和空建構子是一樣的東西,就是沒有定義任何參數以及實作內容的建構子

上一篇
Day05:就像是刷牙洗臉倒垃圾
下一篇
Day07:始祖巨人
系列文
Java SE30

尚未有邦友留言

立即登入留言