2018-03-19 子類可以繼承父類的對象方法。在繼承後,重覆提供該方法,就叫做方法的重寫;又叫覆蓋 override 1、父類Item 父類Item有一個方法,叫做effect 2、子類LifePotion 子類LifePotion繼承Item,同時也提供了方法effect 3、調用重寫的方法 ...
2018-03-19
子類可以繼承父類的對象方法。在繼承後,重覆提供該方法,就叫做方法的重寫;又叫覆蓋 override
1、父類Item
父類Item有一個方法,叫做effect
package property; public class Item { String name; int price; public void buy(){ System.out.println("購買"); } public void effect() { System.out.println("物品使用後,可以有效果"); } }
2、子類LifePotion
子類LifePotion繼承Item,同時也提供了方法effect
package property; public class LifePotion extends Item{ public void effect(){ System.out.println("血瓶使用後,可以回血"); } }
3、調用重寫的方法
調用重寫的方法
調用就會執行重寫的方法,而不是從父類的方法
所以LifePotion的effect會列印:
"血瓶使用後,可以回血"
package property; public class Item { String name; int price; public void effect(){ System.out.println("物品使用後,可以有效果"); } public static void main(String[] args) { Item i = new Item(); i.effect(); LifePotion lp =new LifePotion(); lp.effect(); } }
4、如果沒有重寫這樣的機制怎麼樣?
如果沒有重寫這樣的機制,也就是說LifePotion這個類,一旦繼承了Item,所有方法都不能修改了。
但是LifePotion又希望提供一點不同的功能,為了達到這個目的,只能放棄繼承Item,重新編寫所有的屬性和方法,然後在編寫effect的時候,做一點小改動.
這樣就增加了開發時間和維護成本
package property; public class Item { String name; int price; public void buy(){ System.out.println("購買"); } public void effect() { System.out.println("物品使用後,可以有效果"); } }
package property; public class LifePotion { String name; int price; public void buy(){ System.out.println("購買"); } public void effect(){ System.out.println("血瓶使用後,可以回血"); } }
5、多態
操作符的多態:+ 可以作為算數運算,也可以作為字元串連接
類的多態:父類引用指向子類對象
如果+號兩側都是整型,那麼+代表 數字相加
如果+號兩側,任意一個是字元串,那麼+代表字元串連接
package charactor; public class Hero { public String name; protected float hp; public static void main(String[] args) { int i = 5; int j = 6; int k = i+j; //如果+號兩側都是整型,那麼+代表 數字相加 System.out.println(k); int a = 5;
String b = "5"; String c = a+b; //如果+號兩側,任意一個是字元串,那麼+代表字元串連接 System.out.println(c); } }
觀察類的多態現象:
1. i1和i2都是Item類型
2. 都調用effect方法
3. 輸出不同的結果
多態: 都是同一個類型,調用同一個方法,卻能呈現不同的狀態
package property; public class Item { String name; int price; public void buy(){ System.out.println("購買"); } public void effect() { System.out.println("物品使用後,可以有效果 "); } public static void main(String[] args) { Item i1= new LifePotion(); Item i2 = new MagicPotion(); System.out.print("i1 是Item類型,執行effect列印:"); i1.effect(); System.out.print("i2也是Item類型,執行effect列印:"); i2.effect(); } }
package property; public class LifePotion extends Item { public void effect(){ System.out.println("血瓶使用後,可以回血"); } }
package property; public class MagicPotion extends Item{ public void effect(){ System.out.println("藍瓶使用後,可以回魔法"); } }
類的多態條件:
要實現類的多態,需要如下條件
1. 父類(介面)引用指向子類對象
2. 調用的方法有重寫
那麼多態有什麼作用呢? 通過比較不使用多態與使用多態來進一步瞭解
一、類的多態-不使用多態
如果不使用多態,假設英雄要使用血瓶和魔瓶,就需要為Hero設計兩個方法
useLifePotion和useMagicPotion
除了血瓶和魔瓶還有很多種物品,那麼就需要設計很多很多個方法,比如
usePurityPotion 凈化藥水
useGuard 守衛
useInvisiblePotion 使用隱形藥水
package charactor; import property.LifePotion; import property.MagicPotion; public class Hero { public String name; protected float hp; public void useLifePotion(LifePotion lp){ lp.effect(); } public void useMagicPotion(MagicPotion mp){ mp.effect(); } public static void main(String[] args) { Hero garen = new Hero(); garen.name = "蓋倫"; LifePotion lp =new LifePotion(); MagicPotion mp =new MagicPotion(); garen.useLifePotion(lp); garen.useMagicPotion(mp); } }
二、類的多態-使用多態
如果物品的種類特別多,那麼就需要設計很多的方法
比如useArmor,useWeapon等等
這個時候採用多態來解決這個問題;設計一個方法叫做useItem,其參數類型是Item
如果是使用血瓶,調用該方法
如果是使用魔瓶,還是調用該方法
無論英雄要使用什麼樣的物品,只需要一個方法即可
package charactor; import property.Item; import property.LifePotion; import property.MagicPotion; public class Hero { public String name; protected float hp; public void useItem(Item i){ i.effect(); } public static void main(String[] args) { Hero garen = new Hero(); garen.name = "蓋倫"; LifePotion lp =new LifePotion(); MagicPotion mp =new MagicPotion(); garen.useItem(lp); garen.useItem(mp); } }