package com.itheima.duotai;public class Animal {String name = "動物";public void run(){System.out.println("動物會跑~~~");} }
package com.itheima.duotai;public class Wolf extends Animal{String nama = "狼";@Overridepublic void run() {System.out.println("🐺跑的賊溜~~~");} }
package com.itheima.duotai;public class Cat extends Animal{String name = "小貓";@Overridepublic void run() {System.out.println("🐱跑的賊慢~~~");} }
package com.itheima.duotai;public class Test {public static void main(String[] args) {//對象多態,行為多態Animal a1 = new Wolf();//父類引用子類對象a1.run();//方法:編譯看左邊,運行看右邊System.out.println(a1.name);//成員變量:編譯看左邊,運行也看左邊Animal a2 = new Cat();//父類引用子類對象a2.run();System.out.println(a2.name);} }
運行結果:
🐺跑的賊溜~~~
動物
🐱跑的賊慢~~~
動物
- 多態的前提:有繼承關系;存在父類引用子類對象;存在方法重寫
- 多態是對象、行為的多態,Java中的屬性(成員變量)不談多態。
- 在多態形式下,右邊對象是解耦合的,更便于擴展和維護。
- 定義方法時,使用父類類型的形參,可以接收一切子類對象,擴展性更強,更便利。
- 多態下不能使用子類的獨有功能。
package com.itheima.duotai;public class Animal {String name = "動物";public void run(){System.out.println("動物會跑~~~");} }
package com.itheima.duotai;public class Wolf extends Animal{String nama = "狼";@Overridepublic void run() {System.out.println("🐺跑的賊溜~~~");}//狼吃羊public void eatSheep(){System.out.println("🐺吃羊~~~");} }
package com.itheima.duotai;public class Cat extends Animal{String name = "小貓";@Overridepublic void run() {System.out.println("🐱跑的賊慢~~~");}public void catchMouse(){System.out.println("小貓會捉老鼠~~~");} }
package com.itheima.duotai;public class Test {public static void main(String[] args) {Animal a = new Wolf();//a.eatSheep();報錯,多態下不能調用子類獨有功能//強制類型轉換:可以解決多態下調用子類獨有功能的問題Wolf ww = (Wolf)a;ww.eatSheep();System.out.println("-----------------");Wolf w = new Wolf();go(w);Cat c = new Cat();go(c);}public static void go(Animal a){a.run();//多態下不能調用子類獨有的功能。//但是可以強制類型轉換//轉換前先用instanceof判斷真實性,再進行強制類型轉換。if(a instanceof Wolf ){Wolf w = (Wolf)a;w.eatSheep();}else if(a instanceof Cat){Cat c = (Cat)a;c.catchMouse();}} }
- 小案例:加油站支付小模塊
- 車主可以辦理金卡和銀卡
- 卡片信息包括:車牌號碼、車主姓名、電話號碼、卡片余額
- 金卡辦理時存入金額必須>=5000元,銀卡辦理時存入金額必須>=2000元,金卡支付時享受8折優惠,銀卡享受9折優惠,金卡消費滿200元可以提供打印洗車票的服務
- 需求:請使用面向對象編程,完成該加油站支付機的存款和消費程序
package com.itheima.demo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;//lombok技術可以實現getter和setter方法 無參構造器 toString方法等 @Data // @Data注解可以自動生成getter和setter方法 無參構造器 toString方法等 @AllArgsConstructor// @AllArgsConstructor注解可以自動生成帶參數的構造器 @NoArgsConstructor//有參構造器寫了,@Data中的無參構造器就沒了,這里還要再加一個無參構造器 //用上面這三個注解需要設置一下idea,允許注解程序,設置一次就行:File->settings->搜索annotat->在Enable annotation processing前打對勾->apply->ok public class Card {private String cardId;private String name;private String phone;private double money;//預存金額public void deposit(double money){this.money += money;}//消費金額public void consume(double money){this.money -= money;} }
package com.itheima.demo;public class GoldCard extends Card{public GoldCard(String cardId, String name, String phone, int money) {super(cardId, name, phone, money);}@Overridepublic void consume(double money) {System.out.println("您當前消費:"+ money);System.out.println("優惠后的價格:"+ money*0.8);if(getMoney()<money*0.8){System.out.println("余額不足!");return;}//更新金卡賬戶余額setMoney(getMoney()-money*0.8);//消費大于200,打印洗車票if(money*0.8>=200){printTicket();}else{System.out.println("無洗車票");}}//打印洗車票public void printTicket(){System.out.println("請洗車");} }
package com.itheima.demo;public class SilverCard extends Card{public SilverCard(String cardId, String name, String phone, int money) {super(cardId, name, phone, money);}@Overridepublic void consume(double money) {System.out.println("您當前消費:"+ money);System.out.println("優惠后的價格:"+ money*0.9);if(getMoney()<money*0.9){System.out.println("余額不足");return;}//更新金卡賬戶余額setMoney(getMoney()-money*0.9);} }
package com.itheima.demo;import java.util.Scanner;public class Test {public static void main(String[] args) {//1、創建卡片類,以便創建金卡或者銀卡對象,封裝車主數據//2、定義一個卡片父類:Card,定義金卡或者銀卡的共同屬性和方法//3、定義金卡類:GoldCard,繼承Card類,重寫消費方法(8折),獨有打印洗車票//4、定義銀卡類:SilverCard,繼承Card類,重寫消費方法(9折)//5、辦一張金卡:創建金卡對象,交給一個獨立的業務(支付機)來完成:存款,消費GoldCard gc = new GoldCard("123456","張三","13800000001",5000);pay(gc);//6、辦一張銀卡:創建銀卡對象,交給一個獨立的業務(支付機)來完成:存款,消費SilverCard sc = new SilverCard("123456","張三","13800000001",2000);pay(sc);}//支付機:用一個方法來刷卡:可能金卡,也可能銀卡,所以形參用父類Cardpublic static void pay(Card c){System.out.println("請刷卡,輸入消費金額");Scanner sc = new Scanner(System.in);double money = sc.nextDouble();c.consume(money);} }