QQ个性网:专注于分享免费的QQ个性内容

关于我们| 网站公告| 广告服务| 联系我们| 网站地图

搜索
编程 JavaScript Java C++ Python SQL C Io ML COBOL Racket APL OCaml ABC Sed Bash Visual Basic Modula-2 Logo Delphi IDL Groovy Julia REXX Chapel X10 Forth Eiffel C# Go Rust PHP Swift Kotlin R Dart Perl Ruby TypeScript MATLAB Shell Lua Scala Objective-C F# Haskell Elixir Lisp Prolog Ada Fortran Erlang Scheme Smalltalk ABAP D ActionScript Tcl AWK IDL J PostScript IDL PL/SQL PowerShell

Java 17 多态看这篇肯定够了

日期:2025/04/06 15:54来源:未知 人气:53

导读:Java 17 多态思维导图首先说说什么是多态。 多态:这最早用于与生物学,广义的指多种表现形式。在 Java 中主要是方法的重写,也就是父类和子类之间的一种不同的表现。一般情况下,多态是离不开上面的要素, 总结就是,继承(父子类)、重写、以及子父类转义。对于多态是面向对象继继承之后的另一个特性之一。这里的几个概念一定要记牢记清楚, 重载,重写(覆盖)。虽然我也经常傻傻分不清楚......

Java 17 多态

思维导图

首先说说什么是多态。 多态:这最早用于与生物学,广义的指多种表现形式。

在 Java 中主要是方法的重写,也就是父类和子类之间的一种不同的表现。

一般情况下,多态是离不开上面的要素, 总结就是,继承(父子类)、重写、以及子父类转义。

对于多态是面向对象继继承之后的另一个特性之一。

这里的几个概念一定要记牢记清楚, 重载,重写(覆盖)。虽然我也经常傻傻分不清楚,努力记喽, 还能怪我喽。

重载: 方法名相同,但是方法的参数不同,调用方法时, 根据方法的参数决定调用那一个。对于重载通常是在编译时进行的, Java虚拟机根据不同的参数类型,个数已经顺序,寻找最合适的方法, 方法的返回类型不参与匹配。

重写(覆盖): 子类和父类存在相同的方法名, 相同的参数类型,相同的返回类型,并且子类覆盖了父类的一个方法实现。也就是基于重写的机制实现了多态。

对于重载到底算不算多态机制, 这个就不要过多纠结。 最主要的是知道怎么使用在那使用, 比这些更重要。

语法格式

狭义的举例:

父类父类实例=new子类实例; 举例:SuperClasssuperClass=newSubClass();

举一个小例子贯穿一下学习。

业务场景, 现在已有一个线上购物系统, 并且要升级改造支持在线支付。 需要支持支付宝支付,微信支付,银联支付。一开始不考虑上来就写, 就是定义各个业务逻辑。 demo 例子如下:

编写测试:

如果使用多态, 就可以把上面的业务进行扩展以及改善代码组织。 这个时候, 需要定义一个父类支付类。 支付的一个方法。pay(支付人, 支付金额);

注意:这里只是演示类的多态。 这里其实可以使用接口进行定义更加合适。因为现在还没有说到接口, 等说到接口的时候在详细说说接口里的多态实现。

修改 WeChatPayAliPay 以及 UnionPay 都继承自 PayBase 修改了返回值当返回 true 的时候代表支付成功。

编写测试代码:

子类的对象向上自动转型。实际运行时虽然是父类对象但是调用的却是对应的子类实例。

根据分类 new 子类, 实际调用的时候执行是子类的机制,可以封装一个支付工具。

调用的时候, 就可以直接使用这个静态函数。 并且构造函数位私有, 就是不允许实例化。

测试的代码就可以改成如下:

这样的好处, 如果有新的支付方式, 只需要修改 PayUtil 即可。当然这个程序可以继续优化, 让调用更方便。

上面的案例, 演示了什么加做重写。 以及父类对象创建了子类的引用。 如何理解向下父类对象转换成子类对象呢?

举个例子:

修改 WeChatPay.java 增加 queryPayInfo(String name); 方法。 这个时候, 因为父类中并没有这个函数, 所以使用子类再调用的时候是找不到这个方法呢。 只能通过 Java 的类型转换, 父类转换成子类进行使用。

PayUtil.java修改如下:

测试代码如下:

并且在转换之前是没有办法访问到 queryPayInfo方法的。

子类的重写必须修饰符,返回值,方法名,方法参数必须一致才行。 如果不一致, 调用就会有问题,

修改代码;

publicvoidqueryPayInfo(Stringname){ System.out.println("微信已支付信息\n"+name+" 已经支付成功了!"); return; }

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

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

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

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

关于我们|网站公告|广告服务|联系我们| 网站地图

Copyright © 2002-2023 某某QQ个性网 版权所有 | 备案号:粤ICP备xxxxxxxx号

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告