日期:2025/04/06 15:54来源:未知 人气:53
首先说说什么是多态。 多态:这最早用于与生物学,广义的指多种表现形式。
在 Java 中主要是方法的重写,也就是父类和子类之间的一种不同的表现。
一般情况下,多态是离不开上面的要素, 总结就是,继承(父子类)、重写、以及子父类转义。
对于多态是面向对象继继承之后的另一个特性之一。
这里的几个概念一定要记牢记清楚, 重载,重写(覆盖)。虽然我也经常傻傻分不清楚,努力记喽, 还能怪我喽。
重载: 方法名相同,但是方法的参数不同,调用方法时, 根据方法的参数决定调用那一个。对于重载通常是在编译时进行的, Java虚拟机根据不同的参数类型,个数已经顺序,寻找最合适的方法, 方法的返回类型不参与匹配。
重写(覆盖): 子类和父类存在相同的方法名, 相同的参数类型,相同的返回类型,并且子类覆盖了父类的一个方法实现。也就是基于重写的机制实现了多态。
对于重载到底算不算多态机制, 这个就不要过多纠结。 最主要的是知道怎么使用在那使用, 比这些更重要。
狭义的举例:
父类父类实例=new子类实例; 举例:SuperClasssuperClass=newSubClass();
举一个小例子贯穿一下学习。
业务场景, 现在已有一个线上购物系统, 并且要升级改造支持在线支付。 需要支持支付宝支付,微信支付,银联支付。一开始不考虑上来就写, 就是定义各个业务逻辑。 demo 例子如下:
编写测试:
如果使用多态, 就可以把上面的业务进行扩展以及改善代码组织。 这个时候, 需要定义一个父类支付类。 支付的一个方法。pay(支付人, 支付金额);
注意:这里只是演示类的多态。 这里其实可以使用接口进行定义更加合适。因为现在还没有说到接口, 等说到接口的时候在详细说说接口里的多态实现。
修改 WeChatPay
和 AliPay
以及 UnionPay
都继承自 PayBase
修改了返回值当返回 true 的时候代表支付成功。
编写测试代码:
子类的对象向上自动转型。实际运行时虽然是父类对象但是调用的却是对应的子类实例。
根据分类 new 子类, 实际调用的时候执行是子类的机制,可以封装一个支付工具。
调用的时候, 就可以直接使用这个静态函数。 并且构造函数位私有, 就是不允许实例化。
测试的代码就可以改成如下:
这样的好处, 如果有新的支付方式, 只需要修改 PayUtil
即可。当然这个程序可以继续优化, 让调用更方便。
上面的案例, 演示了什么加做重写。 以及父类对象创建了子类的引用。 如何理解向下父类对象转换成子类对象呢?
举个例子:
修改 WeChatPay.java
增加 queryPayInfo(String name);
方法。 这个时候, 因为父类中并没有这个函数, 所以使用子类再调用的时候是找不到这个方法呢。 只能通过 Java 的类型转换, 父类转换成子类进行使用。
PayUtil.java
修改如下:
测试代码如下:
并且在转换之前是没有办法访问到 queryPayInfo
方法的。
子类的重写必须修饰符,返回值,方法名,方法参数必须一致才行。 如果不一致, 调用就会有问题,
修改代码;
publicvoidqueryPayInfo(Stringname){ System.out.println("微信已支付信息\n"+name+" 已经支付成功了!"); return; }
编译测试代码就会报错。 错误如下:
从上面的例子上, 我们可以看出, 对于子类的重写是一个功能扩展很好的方式。
对于类的多态就先说到这里。 后续更多内容, 关注不迷路喽。
每篇一句:活着就意味着必须要做点什么,请好好努力。努力的最大意义,是让自己随时有能力跳出自己厌恶的圈子。