1.使用繼承的原因:
提高代碼的重用性;提高程序的擴展性。
2.java繼承的語法格式:
public class 類名(子類、派生類、超類)? extends 類名(父類、基類) {
}
注:Java類只能繼承一個父類(單繼承)。
3.子類從父類中繼承到的屬性和方法能否被調用與訪問修飾符的關系:
4.方法重寫:
① 用途:子類和父類有同一個方法,但需要不同實現時,使用重寫。
② 重寫的條件:1.必須有繼承關系;
2.子類在重寫父類的方法時,子類方法的訪問修飾符必須要大于或者等于父類方法的訪問修飾符;
3.子類在重寫父類的方法時,子類方法的返回值類型,方法名,參數都必須要和父類的完全一致。
③ 調用重寫后的方法格式:
根據new關鍵字后的類名來決定調用的對象是誰的——new關鍵字后類名是子類,那么會有限調用子類中重寫的方法;如果子類沒有,則執行父類中的方法。
④ 如果想要在子類重寫的方法中調用父類中的方法,那么應該如何實現?
使用super關鍵字。
練習
1.回合制對戰游戲:奧特曼迪迦和小怪獸哥斯拉進行PK,直到一方的血量為0時結束戰斗,輸出誰勝利了!
如果奧特曼迪迦勝利,則奧特曼迪迦要和另一個奧特曼對象進行PK,直到一方的血量為0時結束戰斗,輸出誰勝利了!
如果小怪獸哥斯拉勝利,則小怪獸哥斯拉要和另一個小怪獸對象進行PK,直到一方的血量為0時結束戰斗,輸出誰勝利了!
要求是類中只能有一個攻擊方法,方法中也只能有一個參數。
在這一節的練習中。我本來的想法是再創建一個奧特曼2類和小怪獸2類,因為最先寫的攻擊方法是分別給奧特曼和小怪獸的。比如小怪獸的攻擊方法只能是面向奧特曼的。如下所示
public void attack(OutMan om){
//被攻擊方HP減少2
om.HP=om.HP-2;
? System.out.println(name+"攻擊了奧特曼"+om.name+",對方的血量減少至"+om.HP);
?if(om.HP==0){//判斷奧特曼的血量是否為零
? System.out.println(name+"作為小怪獸已經擊敗了奧特曼"+om.name);
}
}
而建立了怪獸2類就可以使怪獸的攻擊能面向小怪獸了。
然而我這樣的想法是錯的。因為表面上是達到了需求,實際上增加了類。原有的奧特曼依然不能攻擊小怪獸類。
代碼量也很冗長復雜。因為需要重新寫兩個類和兩個新的攻擊方法。
最后明白,達到原題的目的,只需要建立一個大類(Person),和對雙方通用的攻擊方法,讓奧特曼和小怪獸成為Person的子類,去繼承過來,這樣就解決了。
public void attack(Person p){
//被攻擊方HP減少
p.HP--;
System.out.println(name+"攻擊了"+p.name+",對方的血量減少至"+p.HP);
if(p.HP==0){//判斷怪獸的血量是否為零
System.out.println(name+"已經擊敗了"+p.name);
}
}
比如奧特曼對于Person的繼承:
package OutMan2;
public class OutMan extends Person{
}
非常的簡潔和簡練。這使我深刻體會到繼承的好處。