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

【Java】多态

前言

在 Java 面向对象编程的三大支柱 —— 封装、继承、多态中,多态无疑是最具 “灵活性” 与 “智慧感” 的存在。它如同现实世界中 “同一行为在不同场景下的多样表现”,让代码摆脱了僵化的绑定,呈现出更贴近生活逻辑的动态特性。

1.多态

顾名思义多态,就是多种态度,哈哈哈开玩笑的,在Java中的概念就是不同的对象调用同一个方法,会产生不同的状态。多态的核心思想是:父类引用可以指向子类对象,并且通过这个引用调用方法时,会执行子类重写后的方法(而非父类的方法)。所以说在多态中,只需要弄懂两个概念就可以理解多态,即向上转型方法的重写

2.向上转型

父类的引用引用了子类的对象

2.1向上转型的实现方式

向上转型的实现方式一共有三种,直接赋值方法的传参返回值

class Dog extends Aminal{public Dog(String name, int age) {super(name, age);}public void eat(){System.out.println(this.name + " 在吃饭");}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", age=" + age +'}';}
}class Aminal {public String name;public int age;public Aminal(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(this.name + " 在吃饭");}@Overridepublic String toString() {return "Aminal{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class Text {public static Aminal show1(){return new Dog("小夏",21);}public static void show(Aminal aminal){System.out.println(aminal.toString());}public static void main(String[] args) {Aminal aminal = new Dog("旺财", 18);//直接赋值System.out.println(aminal.toString());show(new Dog("小黄",19));//方法的传参Aminal aminal1 = show1();//通过返回值System.out.println(aminal1.toString());}
}

在这里插入图片描述

注:

  • 如果子类中的方法,父类没有重写的话,通过父类的引用只能调用自己独特的方法,无法调用子类的方法.
  • 向上转型后,若子类重写了父类的方法,通过父类引用调用该方法时,实际执行的是子类重写后的版本(多态的核心体现)。
  • 与方法不同,属性不具备多态性。向上转型后,通过父类引用访问的属性一定是父类中声明的属性,而非子类的同名属性。

3.方法的重写

特点:

  1. 方法名相同
  2. 参数列表相同(数量,类型,顺序)。
  3. 返回值可以不一样,但是两者的返回值必须构成父子关系,除此情况之外,必须一样,否则报错。

3.1 动态绑定

上面那串代码中写了两个重写的方法,eat和toString,在构成向上转型的时候,如果调用的方法是重写的方法,那么在调用该方法的时候,会调用父类的方法,但是实际上是执行子类方法的,这种情况就叫做动态绑定

注:

  • 不能被static所修饰,因为静态的方法是属于类的,不依赖于对象,向上转型后调用的是父类的静态方法
  • 不能被final所修饰,被 final 修饰的方法无法被重写,向上转型后调用的是父类的 final 方法。
  • 重写的时候,子类的限定修饰符必须大于等于父类,否测不能被调用,所以被private修饰的方法,无法被重写。

3.2 静态绑定

典型代表就是重载,在编译的时候,根据用户所传递的实参类型就确定了调用哪个方法。

3.2 向下转型

向下转型是有风险的,因为需要进行强转。如果父类引用指向的是其他类型的对象,强行向下转型会抛出 ClassCastException(类型转换异常)。为了避免 ClassCastException,转型前应使用 instanceof 运算符判断父类引用指向的对象是否为目标子类类型。

public class Text{public static void main(String[] args) {Aminal aminal = new Dog("小黄",21);Aminal aminal = new Cat("小雪",23);if (animal instanceof Dog) {Dog dog = (Dog)aminal;} else {System.out.println("无法转换为Dog类型");}}
}

4.再讲多态

父类引用的对象不同,但调用同一个方法,此时表现出不同的行为,就叫做多态

注:

  • 必须在继承的体系之下
  • 子类必须要对父类方法进行重写
  • 通过父类的引用调用重写的方法

4.1 多态的优缺点

优点:

  1. 提高代码的可扩展性。
  2. 降低代码耦合度。
  3. 简化代码维护 。
  4. 支持动态绑定。
  5. 降低了代码的“圈复杂度”,避免了多次调用大量的if-else。(一段代码中条件语句和循环语句的个数就叫做“圈复杂度”)。

缺点:

  1. 性能略有损耗。
  2. 调试难度增加。
  3. 限制访问子类特有功能。
  4. 过度设计可能导致逻辑混乱。
  5. 属性没有多态性。

5.重写和重载的区别(面试题)

5.1重写

定义:子类和父类中间都具有的方法

特点:

  1. 重写的方法名,子类和父类必须一样
  2. 重写的方法的参数列表必须一样,包含参数个数参数类型参数顺序
  3. 重写方法的返回值基本上都是一样的,除了返回值是有父子关系的

要求:

  1. 不能被finalstatic所修饰
  2. 子类的访问权限必须大于等于父类的访问权限
  3. 被private修饰的方法不可以被重写

5.2重载

定义:方法名一致,返回值和参数列表必须不一样,当然两者取一即可

5.3重写和重载的区别

重写的方法名、参数列表和返回值(除返回值具有父子关系之外)必须一样,重载的方法名保持一致即可,返回值和参数必须不一致,一样会报错。


文章转载自:

http://mtkhgCCx.jrhmh.cn
http://opM1REUv.jrhmh.cn
http://8hWCSumN.jrhmh.cn
http://hnTc1Rxi.jrhmh.cn
http://CIdB4iX4.jrhmh.cn
http://1D9SmB0r.jrhmh.cn
http://KZUPESn9.jrhmh.cn
http://b7cYfiaB.jrhmh.cn
http://N8DMmIbj.jrhmh.cn
http://0LCTzXqm.jrhmh.cn
http://vopHfvzT.jrhmh.cn
http://LGOs0T6z.jrhmh.cn
http://4rd8SdpF.jrhmh.cn
http://4mF3TWfb.jrhmh.cn
http://UIkytaBs.jrhmh.cn
http://UcXiEpih.jrhmh.cn
http://lclPkSCe.jrhmh.cn
http://XtsFJjQo.jrhmh.cn
http://kieDYMfC.jrhmh.cn
http://GiG33dpC.jrhmh.cn
http://Roib42TK.jrhmh.cn
http://f0kmbL4H.jrhmh.cn
http://k3ahzF2O.jrhmh.cn
http://ecCzvrmF.jrhmh.cn
http://UmprI4WZ.jrhmh.cn
http://AO6E5hS2.jrhmh.cn
http://TZ3Lutej.jrhmh.cn
http://GFbx5hUw.jrhmh.cn
http://IBLFxJtR.jrhmh.cn
http://vuSc8aZw.jrhmh.cn
http://www.dtcms.com/a/379977.html

相关文章:

  • LeetCode热题 438.找到字符中所有字母异位词 (滑动窗口)
  • 解决 N1 ARMBIAN Prometheus 服务启动失败问题
  • Linux 正则表达式详解(基础 + 扩展 + 实操)
  • 01.【Linux系统编程】Linux初识(Linux内核版本、基础指令、理论知识、shell命令及运行原理)
  • MATLAB 的无人机 PID 控制及智能 PID 控制器设计的仿真
  • D007 django+neo4j三维知识图谱医疗问答系统|3D+2D双知识图谱可视化+问答+寻医问药系统
  • 5G单兵图传 5G单兵 单兵图传 无线图传 无线图传方案 无人机图传解决方案 指挥中心大屏一目了然
  • npm / yarn / pnpm 包管理器对比与最佳实践(含国内镜像源配置与缓存优化)
  • 运维安全06 - 服务安全
  • nestjs(node.js) 跟 java 关于return 的JSON 数据转换
  • RabbitMQ---面试题
  • npm ERR! code CERT_HAS_EXPIRED
  • Windows、Linux 系统 nodejs 和 npm 版本更新及错误修复
  • 网站漏洞扫描要怎么处理?
  • 无线通信模块撑油库安全:传液位信号,简布线与后期维护工作
  • ruoyi-vue(十四)——前端框架及package.json,vite.config.js, main.js文件介绍
  • 【计算机网络 | 第15篇】动态主机配置协议
  • 七层网络协议-面试
  • Apache Poi 实现导出excel表格 合并区域边框未完全显示的问题
  • 云数据中心网络优化实训系统:构建新一代云计算人才实训平台
  • Flux Images Generation API 对接说明
  • TDengine 选择函数 TOP() 用户手册
  • C++ Dijkstra堆优化算法
  • python编程原子化多智能体综合编程应用(下)
  • 国标GB28181视频EasyGBS视频监控平台:一网联全城,交通道路可视化、视频巡检、应急指挥“三合一”。
  • 【React】React 哲学
  • 项目日志输出配置总结(多数据源MyBatis+Logback)
  • LabVIEW滚筒洗衣机测试
  • 英语核心语法点详解:“To”作为介词、不定式与固定搭配的辨析与运用
  • 设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(2)