Java面向对象三大特征之--多态

发布时间:2026/10/16 9:27:31

Java面向对象三大特征之--多态 前言前面我们已经学习了封装、继承两大特征今天我们来学习面向对象的三大特征中的最后一个特征多态。废话不多说让我们一起开始吧目录一、向上转型和向下转型1.1 向上转型自动类型转换1.1.1 定义1.1.2 写法1.1.3 特点1.1.4 能调用什么1.1.5 限制1.2 向下转型强制类型转换1.2.1 定义1.2.2 写法1.2.3 缺陷与解决方法1.2.4 作用二、多态2.1 多态的概念2.2 多态的写法2.3 多态的实现条件三、方法重写3.1 重写的本质3.2 重写的概念3.3 重写的规则3.4 和多态的关系四、静态绑定和动态绑定4.1 概念4.2 静态绑定早绑定4.3 动态绑定晚绑定4.4 浓缩口诀4.5 代码示例五、多态的优缺点5.1 优点5.2 缺点一、向上转型和向下转型在讲多态之前我们需要先学一下向上转型和向下转型因为多态需要用到向上转型。1.1 向上转型自动类型转换1.1.1 定义父类引用接收子类对象。自动转换不用强转。代码示例1.1.2 写法父类类型 引用名new 子类类型();1.1.3 特点自动完成不用写任何强制符号1.1.4 能调用什么编译看左边父类只能调用父类里面定义的方法如果子类重写了这个方法运行看右边执行子类重写的代码这就是多态1.1.5 限制父类引用不能直接访问子类独有的成员变量和成员方法只能调用父类自己的。编译看左边父类引用只能看到父类中定义的成员成员方法、成员变量子类新增的成员变量新增的成员方法哪怕真实对象是Dog父类引用都不能直接访问编译直接报错。1.2 向下转型强制类型转换1.2.1 定义已经向上转型后的引用强制转回子类类型需要手动强转。代码示例注意点上述代码中的animal这个引用虽然进行了强转但是animal这个引用本身类型永远不变它始终是Animal类型向下转型Dog dog(Dog) animal;不是把animal改造了而是新建了一个Dog类型的引用变量dog让它指向同一个对象。所以animal依旧不能直接访问子类独有的成员⬇1.2.2 写法子类类型 引用名子类类型父类引用名1.2.3 缺陷与解决方法必须手动写Dog强制转换有风险⚠当项目代码多、有很多父类引用各自指向不同子类。时间久了你不能一眼看出来某个Animal用用底层到底装的是哪个子类对象凭感觉直接强转Dog类型如果这个引用实际对象的对应类型不是Dog运行直接抛出ClassCastException类型转换异常。Java中为了提高向下转型的安全性引入了instanceof如果该表达式为true则可以安全转换⬇如果表达式是false则if里面的强制类型转换的代码块不会执行就不会发生类型转换异常⬇1.2.4 作用转完之后就可以调用子类独有的成员了。是通过新的dog引用调用不是animal。二、多态2.1 多态的概念多态通俗来说就是多种形态同一个行为不同对象有不一样的实现形式。父类定义方法各个子类重写该方法使用父类引用指向不同的子类对象调用这个方法时会自动执行对应子类重写后的版本呈现不同的行为。比如同样是“叫”这个行为狗是“汪汪叫”猫是“喵喵叫”鸭子是“嘎嘎叫”我们统一有一个动物父类里面定义了 叫() 这个行为。狗、猫、鸭子都是动物的子类各自重写了叫的方法。变量的类型是动物父类但它实际是一只狗子类。同样一句叫() 对象不同表现出来效果不一样这就是多态。代码示例2.2 多态的写法父类类型 引用变量new 子类类型();比如Animal animal new Dog();父类引用指向子类对象。调用 animal.叫() 实际执行的是Dog里面的叫方法。父类引用指向子类对象调用同一个方法看右边实际对象执行子类重写后的代码。2.3 多态的实现条件①必须在继承体系下②子类必须要对父类中方法进行重写③通过父类的引用调用重写的方法三、方法重写在继承那篇我们已经讲过了方法重载和方法重写两个易混淆的概念今天我们再来温故而知新一下方法重写因为它是实现多态关键。3.1 重写的本质子类覆盖父类用一个实例方法配合多态父类引用调用时执行子类的逻辑。3.2 重写的概念重写(Override)也就称为覆盖。重写是子类对父类非静态、非private修饰非final修饰非构造方法等的实现过程进行重新编写。返回值和形参都不能改变。即外壳不变核心重写。重写的好处在于子类可以根据需要定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。为啥不能重写静态方法、private修饰的方法final修饰的方法构造方法①. static 静态方法不能重写静态方法属于类不属于对象编译阶段就绑定好了。父类静态方法跟着父类子类同名静态方法跟着子类二者互不覆盖这叫隐藏不是重写。多态是基于对象的机制静态和对象无关自然不存在重写。②. private 私有方法不能重写private 方法只在本类内部可见子类根本看不到这个方法。子类写一个一模一样名字、参数的方法只是子类新建了一个属于自己的全新方法并没有覆盖父类的私有方法。看不见就谈不上重写。③. final 修饰的方法不能重写final 关键字作用就是锁定这个方法禁止子类覆盖修改实现。只要父类方法加了final编译器直接拦截子类不能写同名同参数的重写方法。注意final修饰方法只是禁止重写父类本身仍然可以被继承。④. 构造方法不能重写构造方法名字必须和当前类名完全相同。父类Animal构造名叫 Animal() 子类Dog构造名叫 Dog() 。重写要求方法名、参数列表一致名字都不一样直接不满足重写最基础的条件。子类构造方法的 super() 只是调用父类构造不是重写。3.3 重写的规则①.子类在重写父类的方法时方法名参数列表必须与父类原型保持一致。②.子类在重写父类的方法时返回值类型如果是基本数据类型(int、double等)就必须与父类保持一致父类返回int子类重写只能是int。如果返回值类型是引用类型(类/接口)那子类重写的方法返回值类型可以和父类不同但是必须是父类方法返回类型的子类比如父类方法返回类型为A子类重写的返回类型只能是A或者是A的子类。③子类重写的父类方法的访问权限要大于等于父类原本的方法比如如果父类方法被public修饰则子类中重写该方法就不能写protected。④父类被static、private、final修饰的方法构造方法都不能被重写。⑤重写的方法可以使用Override注解来显示指定有了这个注解就能帮助我们进行一些合法性校验例如不小心将方法名字拼写错了比如写成aet那么此时编译器就会发现父类中没有aet方法就会编译报错提示无法构成重写。如果不加Override注解⬇不加 Override 的隐患当我们打算重写父类方法不小心写错方法名/参数列表时代码可以正常编译、正常运行不会报任何错误。程序会把它当成子类新增的独立方法。我们主观上以为完成了重写实际上没有后续使用多态的时候就会出现不符合预期的结果这种隐性逻辑bug很难排查。加上Override注解⬇加上 Override 注解后在编写代码、编译阶段就能直接看到报错提示不需要等到程序运行之后。IDEA 在 Override 注解上标出波浪下划线提醒我们当前这个方法并没有重写父类的对应方法说明我们写重写的时候出错了。Override 的意义就是提前校验在运行代码之前就发现重写的错误避免出现能正常运行但逻辑不符合预期的隐性bug。3.4 和多态的关系方法重载是一个类的多态性表现方法重写是子类与父类的一种多态性表现。四、静态绑定和动态绑定4.1 概念[绑定]:绑定是指方法调用和方法本体配对的过程静态绑定编译阶段就确定调用哪个方法。动态绑定运行阶段才确定调用哪个方法Java多态底层考的就是动态绑定。4.2 静态绑定早绑定在编译的时候编译器根据引用变量的类型左边的类型直接确定调用哪个方法。在编译器就绑定运行的时候不变。适用静态方法private修饰的方法final修饰的方法构造方法。静态绑定不支持多态。4.3 动态绑定晚绑定编译时只看引用类型运行的时候看对象真实类型new出来的右边类型再去找对应的重写方法。这就是多态的底层原理。如果没有动态绑定向上转型后就永远只能执行父类的方法就不存在多态。只有实例方法重写才会触发动态绑定才有多态效果。适用只有普通实例方法可以被重写的方法才会触发动态绑定。4.4 浓缩口诀静态绑定编译看左运行也看左没有多态。动态绑定编译看左运行看右实现多态。4.5 代码示例五、多态的优缺点5.1 优点①. 代码扩展性好。以后新增子类不用改原来写的调用代码。比如现在AnimalDog、Cat后面再加Pigmain里面调用animal.eat()那一行完全不用动直接新加类就行符合开闭原则。②. 降低代码耦合。调用方只需要认识父类不用关心具体是哪个子类不需要依赖子类细节。[什么是耦合]耦合就是代码和代码之间邦得有多紧。假设我写一段代码专门去喂狗Dog dog new Dog();dog.eat();这段代码直接写死依赖Dog类。如果以后我想改成喂猫你就得回来改这行代码把Dog换成Cat。调用代码跟Dog紧紧绑在一起这就叫耦合高。用多态之后Animal animal new Dog();animal.eat();调用代码只认识父类Animal它根本不管后面是Dog、Cat还是Pig。想换成猫只需要右边改成 new Cat() 调用那一行 animal.eat() 完全不用改。调用代码不依赖具体子类耦合低。③. 代码简洁复用性强。可以统一写一套父类的调用逻辑不同子类自动执行自己重写的方法不用写一堆if判断去区分是什么动物。5.2 缺点①. 向上转型之后不能直接调用子类独有的方法。比如 Animal animal new Dog(); animal不能直接调用Dog里面独有的watchDoor()想用的话得向下转型强转强转还容易抛出类型转换异常有风险。②. 运行的时候才确定执行哪个方法调试稍微麻烦一点。读代码的时候光看变量类型看不出实际执行哪个方法。六、总结本篇我们一起学习面向对象的最后一个特性--多态并且通过多态延伸出了其他的知识向上(下)转型、方法重写、静态绑定动态绑定最后总结了多态的优缺点。欢迎大佬在评论区指出错误。我将持续更新学习笔记哦~我们下篇再见拜拜
延伸阅读

更多相关文章

2026/10/16 9:27:31

建冷库还要找好几家供应商?一站式配套有多省心

很多人第一次建冷库会踩坑:库板找一家、冷库门找一家、制冷机组再找另外一家。多方对接沟通成本高,设备之间还容易出现不匹配的情况,出问题几家互相推卸责任。月宫冷冻可以提供一条龙配套,冷库用到的库板、冷库门、压缩机组等核心…

2026/10/16 10:38:44

用Python将Obsidian笔记库向量化,搭建个人AI知识库实战

大概两三个月前,我的 Obsidian 笔记库突破 4000 个 Markdown 文件之后,第一个撑不住的不是 Obsidian 本身,而是“检索”这个动作。过去用标题搜索、全文搜索还能勉强定位,可当笔记之间互相引用、标签层层嵌套、还混着大量从文档里…

2026/10/16 10:38:44

基于Spring Boot+Vue的职业心理测评系统设计与实现

简介:这套职业心理测评系统源码面向系统开发者、人力资源管理者和就业指导人员,可用于职业倾向分析、人才选拔与员工发展评估等场景。压缩包共2000个文件,以1815个md说明文档、91个js脚本、60个json数据文件、25个xml配置文件为主&#xff0c…

2026/10/16 10:38:44

Android运动会管理APP开发实战:表结构、状态机与成绩排序设计

1. 项目概述与需求拆解:结题报告怎么做才不“水”每年到了毕业季,计算机相关专业的学生里总有相当一批人会选中“基于Android的某某管理APP设计与实现”这种题目。运动会管理APP听起来不算新,但如果你只把它做成一个“报名表录入成绩公告栏”…

2026/10/16 10:38:44

职业心理测评系统源码落地:选型、部署与二次开发避坑指南

简介:职业心理测评系统源码是一套面向职场人士、HR及心理服务者的完整评估与管理系统,可辅助职业规划、人才选拔和就业指导。资源包共2000个文件,约126.45MB,以1815个md文档为主体,另含91个js、60个json、25个xml及少量…

2026/10/16 10:38:44

24类地物SLD样式工程包:GIS毕设与GeoServer项目复用指南

简介:本资源是一套面向GIS开发人员、地图可视化工程师及地理信息专业学习者的GeoServer SLD样式配置实践包,聚焦于复现Google地图风格的多要素分级渲染,解决WebGIS项目中道路、绿地、建筑等地物难以统一美观表达的核心痛点。压缩包共26个文件…

2026/10/16 10:33:34

终端优先的AI编程助手:开源可自托管方案解析

1. 这个项目到底在解决什么问题第一次看到 "free-claude-code" 这个标题,我脑子里蹦出来的第一个念头是:这又是一个蹭 AI 编程助手热度的玩具项目吧?但真正把它的思路捋清楚之后,我发现它切中的其实是一个非常具体的痛点…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/16 0:01:11

Cephadm实战指南:Linux系统工程师的生产级Ceph集群部署与排障

简介:本资源是一份完整的Ceph分布式存储系统中文技术文档合集,面向Linux系统运维工程师、云平台架构师及存储方向开发者,帮助读者系统掌握Ceph集群的部署、配置与运维核心能力。文档覆盖对象存储(RGW)、块设备&#xf…

2026/10/16 0:01:11

ITK中SpatialObject几何体系解析:坐标系、变换与管道集成

1. 空间对象的定位:为什么 ITK 需要一套几何描述体系很多刚开始接触 ITK 的朋友,包括我自己,最初都是被它的图像滤波、配准、分割这些“正统”功能吸引进来的。等真正上手做点实际项目,比如把分割出来的器官边界做量化分析、给血管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑