网站首页 > java教程 正文
Java 17 类的多态
思维导图
首先说说什么是多态。 多态:这最早用于与生物学,广义的指多种表现形式。
在 Java 中主要是方法的重写,也就是父类和子类之间的一种不同的表现。
一般情况下,多态是离不开上面的要素, 总结就是,继承(父子类)、重写、以及子父类转义。
对于多态是面向对象继继承之后的另一个特性之一。
这里的几个概念一定要记牢记清楚, 重载,重写(覆盖)。虽然我也经常傻傻分不清楚,努力记喽, 还能怪我喽。
重载:方法名相同,但是方法的参数不同,调用方法时, 根据方法的参数决定调用哪一个。对于重载通常是在编译时进行的, Java虚拟机根据不同的参数类型,个数已经顺序,寻找最合适的方法, 方法的返回类型不参与匹配。
重写(覆盖):子类和父类存在相同的方法名, 相同的参数类型,相同的返回类型,并且子类覆盖了父类的一个方法实现。也就是基于重写的机制实现了多态。
对于重载到底算不算多态机制, 这个就不要过多纠结。 最主要的是知道怎么使用在哪使用, 比这些更重要。
语法格式
狭义的举例:
父类 父类实例 = new 子类实例;
举例:SuperClass superClass = new SubClass();
举一个小例子贯穿一下学习。
业务场景, 现在已有一个线上购物系统, 并且要升级改造支持在线支付。 需要支持支付宝支付,微信支付,银联支付。一开始不考虑上来就写, 就是定义各个业务逻辑。 demo 例子如下:
编写测试:
如果使用多态, 就可以把上面的业务进行扩展以及改善代码组织。 这个时候, 需要定义一个父类支付类。 支付的一个方法。pay(支付人, 支付金额);
注意:这里只是演示类的多态。 这里其实可以使用接口进行定义更加合适。因为现在还没有说到接口, 等说到接口的时候在详细说说接口里的多态实现。
修改 WeChatPay 和 AliPay 以及 UnionPay 都继承自 PayBase 修改了返回值当返回 true 的时候代表支付成功。
编写测试代码:
子类的对象向上自动转型。实际运行时虽然是父类对象但是调用的却是对应的子类实例。
根据分类 new 子类, 实际调用的时候执行是子类的机制,可以封装一个支付工具。
调用的时候, 就可以直接使用这个静态函数。 并且构造函数位私有, 就是不允许实例化。
测试的代码就可以改成如下:
这样的好处, 如果有新的支付方式, 只需要修改 PayUtil 即可。当然这个程序可以继续优化, 让调用更方便。
上面的案例, 演示了什么叫做重写。 以及父类对象创建了子类的引用。 如何理解向下父类对象转换成子类对象呢?
举个例子:
修改 WeChatPay.java 增加 queryPayInfo(String name); 方法。 这个时候, 因为父类中并没有这个函数, 所以使用子类在调用的时候是找不到这个方法呢。 只能通过 Java 的类型转换, 父类转换成子类进行使用。
PayUtil.java修改如下:
测试代码如下:
并且在转换之前是没有办法访问到 queryPayInfo方法的。
子类的重写必须修饰符,返回值,方法名,方法参数必须一致才行。 如果不一致, 调用就会有问题,
修改代码;
public void queryPayInfo(String name){
System.out.println("微信已支付信息\n" + name + " 已经支付成功了!");
return;
}
编译测试代码就会报错。 错误如下:
从上面的例子上, 我们可以看出, 对于子类的重写是一个功能扩展很好的方式。
对于类的多态就先说到这里。 后续更多内容, 关注不迷路喽。
每篇一句:活着就意味着必须要做点什么,请好好努力。努力的最大意义,是让自己随时有能力跳出自己厌恶的圈子。
猜你喜欢
- 2024-09-27 Java多态重载和重写(类方法设计中多态与重载的区别是什么)
- 2024-09-27 什么是多态?Java为什么要用多态?(java中什么是多态性)
- 2024-09-27 别找了!月薪30k的T6大佬整理的Java多态知识点总结,限时收藏
- 2024-09-27 三十一、Java面向对象编程特性-多态
- 2024-09-27 Java多中包括态理解、多态实现、重写、转型和抽象类
- 2024-09-27 Java中的封装、继承和多态,你真的都懂了吗
- 2024-09-27 java基础之多态与向上转型,很用心的一篇笔记
- 2024-09-27 Java多态的介绍-学习日志(java的多态是什么)
- 2024-09-27 Java路径-25-Java多态(java路径错误)
- 2024-09-27 Java中的多态(基础语法)(java多态的定义和应用)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)