當我們在定義類別時,有三種東西可以定義,屬性(field)、建構子(constructor)、方法(method)。今天要來談談建構子,建構子有些需要刻意注意的潛規則。
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就不會幫我們建立預設的空建構子了。
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);)。聽起來頗麻煩的對不對?能不能有自行定義的建構子,同時也可以讓子類別的建構子不特別指定父類別建構子,或者可以不自行定義建構子?
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的子類別就可以達到不需撰寫任何建構子的目的了。
小結: