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

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.lqws.cn/news/133003.html

相关文章:

  • Canal
  • A2A MCP 集成
  • 硬路由与软路由
  • GMS地下水数值模拟技术及地下水环评
  • NNLM和word2vec的区别
  • 软件工程专业的本科生应该具备哪些技能
  • 4种常见Python设计爱心创意实现方法
  • ROS中的里程计与IMU的消息类型解读
  • apt-get update提示gpg错误
  • 跨域请求解决方案全解析
  • JAVA-springboot JOSN解析库
  • 基于Web的安全漏洞分析与修复平台设计与实现
  • AT2401C中科微2.4g芯片PA
  • 软件工程专业本科毕业论文模板
  • Vue中的自定义事件
  • 手写 vue 源码 === runtime-dom 实现
  • 第十四章 Java基础-接口
  • CMake入门:3、变量操作 set 和 list
  • 使用TypeScript构建一个最简单的MCP服务器
  • 【docker】Windows安装docker
  • 智慧货运飞船多维度可视化管控系统
  • Kubernetes Pod DNS 配置
  • 2025年计算机科学与网络安全国际会议(CSNS 2025)
  • 关于Dify聊天对话名称无法自动生成的原因和解决方法
  • 区块链跨链通信:使用 Cosmos SDK 实现链间互操作
  • Modbus转EtherNET IP网关开启节能改造新范式
  • Mermaid 绘图--以企业权限视图为例
  • Cursor 工具项目构建指南: Web Vue-Element UI 环境下的 Prompt Rules 约束(new Vue 方式)
  • 如何在mac上安装podman
  • 核心线程池大小如何设置?