当前位置: 首页 > news >正文

Javase 基础入门 —— 05 多态

本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员Java+AI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。

01 什么是多态?

多态是在继承或实现情况下的一种现象,表现为对象多态和行为多态。

Animal.java动物类

package Poly;public class Animal {String name = "动物";public void run(){System.out.println("动物会跑~");}
}

Tortoise.java乌龟类

package Poly;public class Tortoise extends Animal{String name = "乌龟";@Overridepublic void run(){System.out.println("乌龟跑得快~");}
}

Wolf.java狼类

package Poly;public class Wolf extends Animal{String name = "狼";@Overridepublic void run(){System.out.println("狼跑得快~");}
}

Test.java测试

package Poly;import javax.lang.model.element.AnnotationMirror;public class Test {public static void main(String[] args) {//对象多态Animal a1 = new Wolf();Animal a2 = new Tortoise();//行为多态a1.run(); //成员方法:编译看左边,运行看右边a2.run();System.out.println(a1.name); //成员变量:编译看左边,运行看左边System.out.println(a2.name);//多态是对象、行为的多态,和成员变量没啥关系}
}

02 多态的前提

  • 继承或实现
  • 父亲引用子类对象
  • 方法重写

03 多态的好处

  • 右边对象解耦合
  • 父类类型的形参可以接收一切子类对象
  • 没法调用子类独有功能
public class Test {public static void main(String[] args) {//好处1:右边对象解耦合Animal a = new Tortoise(); //Animal a = new Wolf();a.run();//好处2:父类类型的形参,可以接收一切子类对象Tortoise t = new Tortoise();go(t);Wolf w = new Wolf();go(w);//坏处1:没法调用子类独有功能//a.shrinkhead();Tortoise t0 = (Tortoise) a;t0.shrinkhead();}public static void go(Animal a){a.run(); //对象回调}
}

04 多态的类型转换

自动类型转换:父类 变量名 = new 子类();

Animal a = new Tortoise(); 

强制类型转换:子类 变量名 = (子类) 父类变量;

Tortoise t0 = (Tortoise) a;

注:编译阶段,存在继承或实现关系,可以进行强制类型转换;运行阶段,如果发现对象的真实类型与强转之后不同,会报类型转换异常(ClassCastExpception)的错。因此,建议在强转之前,使用instanceof查询对象的真实类型。

if(a1 instanceof Wolf){Wolf w1 = (Wolf) a;w1.eatSheep();
}else if(a1 instanceof Tortoise){Tortoise t1 = (Tortoise) a;t1.shrinkHead();
}

05 案例:加油站支付小模块

在这里插入图片描述

Card.java

package fire;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Card {private String carId;private String name;private String tel;private double money;public void deposit(double money){this.money += money;}public void consume(double money){this.money -= money;}
}

GoldCard.java

package fire;public class GoldCard extends Card{public GoldCard(String carId, String name, String tel, double money){super(carId, name, tel, 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);System.out.println("您当前金卡余额:" + getMoney());if(money * 0.8 >= 200){printTicket();}else{System.out.println("不满200元不打印洗车券");;}}public void printTicket(){System.out.println("满200元打印洗车券");}
}

SilverCard.java

package fire;public class SilverCard extends Card{public SilverCard(String carId, String name, String tel, double money){super(carId, name, tel, 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);System.out.println("您当前银卡余额:" + getMoney());}
}

Test.java

package fire;import java.util.Scanner;public class Test {public static void main(String[] args) {GoldCard g = new GoldCard("京A66666","张三", "18899997777", 100000);pay(g);SilverCard s = new SilverCard("粤A00000","李四", "18652997987", 50000);pay(s);}public static void pay(Card c) { //对象多态System.out.println("输入消费金额:");Scanner sc = new Scanner(System.in);double num = sc.nextDouble();c.consume(num);}
}
http://www.xdnf.cn/news/177193.html

相关文章:

  • 【AM2634】 RTI
  • MCP+A2A协议终极指南:AI系统构建技术全解析(医疗/金融实战+Streamable HTTP代码详解)
  • @RequiredArgsConstructor和@AllArgsConstructor的区别
  • 深度图像报错
  • 大模型时代的具身智能:从虚拟到现实的智能体进化革命
  • Spark-Streaming核心编程(四)总结
  • Revive 中的 Precompile 合约:实现与调用机制
  • 学习海康VisionMaster之路径提取
  • 怎么检测代理IP延迟?如何选择低延迟代理?
  • 《明解C语言入门篇》读书笔记四
  • 总线位宽不变,有效数据位宽变化的缓存方案
  • 颠覆传统微商!开源AI智能名片链动2+1模式S2B2C商城小程序:重构社交电商的“降维打击”革命
  • 常见锁策略
  • 再学GPIO(二)
  • 02 业务流程架构
  • npm、pnpm 和 yarn 包管理工具
  • 【密码学——基础理论与应用】李子臣编著 第八章 SM2公钥密码算法 课后习题
  • LeetCode3☞无重复字符的最长子串
  • 辞九门回忆
  • 深入理解编程中的同步与异步:原理、区别及实战应用
  • Go 语言中的 `select` 语句详解
  • CSS元素动画篇:基于当前位置的变换动画(四)
  • 加密算法 AES、RSA、MD5、SM2 的对比分析与案例(AI)
  • (七)RestAPI 毛子(Http 缓存/乐观锁/Polly/Rate limiting)
  • 【学习笔记1】一站式大语言模型微调框架LLaMA-Factory
  • Vue2 与 Vue3 深度对比与技术解析
  • 黑马点评redis改 part 6
  • 一周学会Pandas2 Python数据处理与分析-Pandas2数据信息查看操作
  • 语音识别质量的跟踪
  • 力扣HOT100之链表:23. 合并 K 个升序链表