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);} }