您的位置 首页 java

Java 17 类的多态

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

编译测试代码就会报错。 错误如下:

Java 17 类的多态

从上面的例子上, 我们可以看出, 对于子类的重写是一个功能扩展很好的方式。

对于类的多态就先说到这里。 后续更多内容, 关注不迷路喽。

Java 17 类的多态

每篇一句:活着就意味着必须要做点什么,请好好努力。努力的最大意义,是让自己随时有能力跳出自己厌恶的圈子。

文章来源:智云一二三科技

文章标题:Java 17 类的多态

文章地址:https://www.zhihuclub.com/188567.shtml

关于作者: 智云科技

热门文章

网站地图