這篇要來介紹的就是覆寫 overridding,子類別繼承父類別後,如果不滿意父類別定義的方法,子類別可以在繼承後重新改寫,這就是覆寫。子類別宣告覆寫時,方法名稱、參數個數、參數型別及回傳值皆必須和父類別的被覆寫方法相同,還有一點要注意的是子類別存取控制的存取範圍不可小於父類別。
下面提供一個小例子,Dad跟Son都有一個相同的makeMoney()函式,不過內容不一樣了就是被覆寫掉了,要注意如果父類別的函式沒有回傳值及參數,繼承後也不能更改讓它有回傳值或參數,只能更改裡面的內容。
public class Dad{
public int money;
public int house;
public void makeMoney(){
System.out.println("我很有錢");
}
}
public class Son extends Dad{
public void getSum(int m,int h){
money = m;
house = h;
System.out.println("含著金湯匙");
}
public void makeMoney(){
System.out.println("我也可以不當靠爸族");
}
}
public class Test{
public static void main(String[] args) {
Son son = new Son();
son.makeMoney(); // 我也可以不當靠爸族
}
}
跟this一樣都是關鍵字,關於this有在Day12有稍微提到過。this是指向自己,也就是自己類別的成員;super則是指向父類別的成員,不過只能呼叫上一級的,不能跨級,子類別可透過super()將共同建構子參數傳給父類別,也就是說如果是共同的資料應該用的是父類別的建構子。
this有兩種,this.和this(),前者是關鍵字後者則是建構子,如果寫了很多建構子提供多元的建構物件方式,建構子之間彼此可以使用this()互相呼叫。super也是分成super.和super(),利用super.可以呼叫父類別中定義好相應參數的建構子,父類別已經定義好的東西,子類別直接取用就好,這種寫法也會比較好維護。
如果把上面的Son做一點小修改,其中的makeMoney內新增一行super.makeMoney()
,讓它先呼叫父類別中同名稱的函式,這樣最後主程式的地方就會印出兩行字串(Dad原本的+Son新增的)。
public class Dad{
public int money;
public int house;
public void makeMoney(){
System.out.println("我很有錢");
}
}
public class Son extends Dad{
public void getSum(int m,int h){
money = m;
house = h;
System.out.println("含著金湯匙");
}
public void makeMoney(){
super.makeMoney(); // 新增這一行
System.out.println("我也可以不當靠爸族");
}
}
public class Test{
public static void main(String[] args) {
Son son = new Son();
son.makeMoney(); // 我很有錢
// 我也可以不當靠爸族
}
}