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

Java中的多态

1.认识多态

2.如何写一个多态

3.重写 vs 重载

4.向上转型的三种方法

5.多态的注意事项


1.认识多态

上一篇我们学习和认识了继承,今天我们将要认识多态,多态是基于继承来的,所以我们要学好多态,就需要将继承学习好。

多态就是多种形态,具体点就是去完成某个⾏为,当不同的对象去完成时会产⽣ 出不同的状态

比如说我们现在有一个父类,和俩个子类,我们通过父类引用,引用子类的对象,我们通过调用同一个方法,当子类不同时,调用方法的结果也会不同,这就是多态

2.如何写一个多态

我们现在有一个父类Animal 和 俩个子类分别是Cat和Dog,他们都有各自相同的方法 -- eat

当我们用父类引用,引用子类的对象时,在编译的时候,编译器会根据子类调用子类的方法

因为子类的方法和父类的方法相同 --- 此时就构成了重写

多态的实现条件:

1.必须在继承的关系下

2.子类必须重写父类的方法

3.通过父类引用调用子类重写的方法

3.重写 vs 重载

重载(静态绑定):

1.方法名相同

2.返回值不做要求

3.参数列表不同(数据类型, 顺序, 参数个数)

重写(动态绑定):

1.方法名相同

2.返回值相同(如果在继承关系下,返回值可以是各自的类名)

3.参数列表相同

我认为重写的本质:父类已经为你提供好了一个方法,当这个方法的格式或其他原因无法满足你的要求的时候,你重写在子类中重写一个方法名相同,返回值相同,参数列表相同的一个方法,此时通过父类引用调用子类的重写方法,当编译器编译的时候,会进行动态绑定,当发现有俩个相同的方法,并且存在继承关系,就会实现多态

4.向上转型的三种方法

向上转型:实际就是创建⼀个⼦类对象,将其当成⽗类对象来使⽤

也就是说父类引用,引用子类的对象

1.直接复制

我们可以直接用父类引用,引用子类的对象,并且进行初始化构造,当调用的对象不同时,同一个方法的结果也会不同

2.参数传递

我们可以写一个func方法,参数是父类引用,我们将子类对象传递给父类引用,这样父类就可以引用到子类对象,通过编译时动态绑定,就可以实现调用同一个方法,只要对象不同,调用的结果也会不同

3.返回值传递

同样的,我们可以写一个func方法,当我们传递某一个值,对特定某一个子类对象实例化,然后返回该对象,父类引用指向返回的对象,这样也可以实现调用同一个方法,对象不同时,调用同一个方法的结果不同

5.多态的注意事项

1.子类和父类只要存在继承关系,那么他们重写的方法的返回值可以不同

这种成为协变类型

2.子类的权限必须 >= 父类的权限

3.父类的权限不能为private

4.父类的方法不能被static修饰

5.父类的方法不能被final修饰

多态可以减少代码的冗余和复杂度,让我们的代码看起来更简洁轻松

比如我们要画一个形状,我们要画一头熊,圆, 一头熊,一个立方体,一头熊

如果我们不使用多态来帮助我们的话,我们就需要使用数组存放每一个要画的图形的字符串,然后通过if判断我们要画的形状,如果要画的数量非常多,种类也非常多,那么我们代码就看起来很复杂,很冗余,可读性就比较差

那么我们使用多态就可以非常简化我们的代码,我们可以用父类来定义一个数组,里面存放着我们要调用到的不同对象,通过for-each进行向上转型,就可以实现同一个方法,当对象不同的时候,调用到的结果也不同

我们使用了向上转型,动态绑定,重写,多态,让我们的代码简洁,可读性改善了许多

http://www.xdnf.cn/news/11875.html

相关文章:

  • Java SpringBoot 调用大模型 AI 构建智能应用实战指南
  • 在树莓派上添加音频输入设备的几种方法
  • Rust学习(1)
  • 采用 Docker GPU 部署的 Ubuntu 或者 windows 桌面环境
  • Elasticsearch中的刷新(Refresh)和刷新间隔介绍
  • 【Zephyr 系列 7】BLE 数据透传系统设计与实现:双向通信、缓冲区与状态同步全解析
  • c++第6天--运算符重载
  • Linux基础开发工具——yum工具
  • Flutter快速上手,入门教程
  • stm32——UART和USART
  • URL 结构说明+路由(接口)的认识
  • VSCode 工作区配置文件通用模板(CMake + Ninja + MinGW/GCC 编译器 的 C++ 或 Qt 项目)
  • 软件工程:如何在项目中把软件做好
  • Python爬虫:trafilatura 的详细使用(高效的网页正文提取工具)
  • AI自动化任务执行工具OpenManus一键启动整合包
  • k8s热更新-subPath 不支持热更新
  • 网络安全中网络诈骗的攻防博弈
  • label-studio 标注实体识别
  • 第三篇:MCP协议深度实践——从理论到生产级AI智能体系统
  • go的工具库:github.com/expr-lang/expr
  • 杰发科技AC7840——Timer修改重装载值
  • 深入解析Java17核心新特性(增强NullPointerException、强封装 JDK 内部 API、伪随机数生成器增强)
  • LVDS与GMSL和FPD-Link之间的关系
  • CppCon 2015 学习:All Your Tests are Terrible
  • Unity 中实现可翻页的 PageView
  • 【游戏科学】游戏开发中数学算法的核心与应用
  • Opencl
  • superior哥AI系列第9期:高效训练与部署:从实验室到生产环境
  • 【Linux】centos软件安装
  • ios版本的Tiktok二次安装不上,提示:Unable to Install “TikTok”