尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
多态的基本认识和了解
多态的概念多态的概念通俗来说就是多种形态具体点就是去完成某个行为当不同的对象去完成时会产生出不同 的状态。总的来说就是同一件事发生在不同的对象上产生不同的结果多态实现的条件在Java中实现多态必须满足以下条件1.在继承体系下2.子类必须重写父类的方法3.通过父类的应用调用重写的方法在了解多态前我们得先了解继承向上转型和重写1.继承我们上节博客有讲过这里不再重新讲述了。 接下来我们先了解向上转型和重写向上转型和向下转型向上转型实际就是创建一个子类对象将其当成父类对象来使用。格式父类类型 对象名new子类类型()BasebasenewSub();右边的Sub是子类型被一个父类 的类型引用使小范围向大范围转换称为向上转型向上转型有三种使用场景1.直接赋值2.方法传参3方法返回1.直接赋值publicclassAnimal{publicAnimal(Stringname,intage){this.namename;this.ageage;}Stringname;intage;}publicclassDogextendsAnimal{publicDog(Stringname,intage){super(name,age);}publicstaticvoidmain(String[]args){AnimalanimalnewDog(旺财,10);animal.eat();}}由向上转型直接给赋值将子类的对象直接赋值给父类对象2.方法传参classAnimal{voideat(){System.out.println(Animal eats);}}classDogextendsAnimal{Overridevoideat(){System.out.println(Dog eats bones);}}publicclassMain{staticvoidfeed(Animalanimal){// 参数为父类类型animal.eat();}publicstaticvoidmain(String[]args){DogdognewDog();feed(dog);// 向上转型Dog - Animal}}这里给feed(Animal animal)了一个父类的形参给子类实例话了之后可以将子类的变量调用到函数中。注形参为父类引用可以接受任意系类对象。方法返回classAnimal{publicvoideat(){System.out.println(动物进食);}}classDogextendsAnimal{Overridepublicvoideat(){System.out.println(狗吃骨头);}// 子类独有方法父类中无声明publicvoidbark(){System.out.println(狗汪汪叫);}}// 3. 测试类包含返回父类类型的方法publicclassReturnTest{// 方法声明返回父类Animal实际返回子类DogpublicstaticAnimalgetAnimal(){// 自动向上转型Dog - AnimalreturnnewDog();}publicstaticvoidmain(String[]args){// 接收返回值父类引用指向子类对象典型向上转型AnimalanimalgetAnimal();animal.eat();方法返回的本质来说和直接赋值一样的。向下转型概念将一个子类对象经过向上转型之后当成父类方法使用再无法调用子类的方法但有时候可能需要调用子类特有的方法此时将父类引用再还原为子类对象即可即向下转换。publicclassAnimal{Stringname;intage;voideat(){System.out.println(this.name正在吃饭...);}}publicclassDogextendsAnimal{voideat(){System.out.println(this.name正在吃狗粮...);}}publicclasstest{publicstaticvoidmain(String[]args){AnimalanimalnewDog();animal.name旺财;animal.eat();}}向上转型的优点可以将代码更灵活向下转型的缺点不可以调用子类特有的方法动态绑定publicclassAnimal{publicStringname;publicintage;publicAnimal(Stringname,intage){this.namename;this.ageage;}publicvoideat(){System.out.println(this.name正在吃饭...);}}publicclassCatextendsAnimal{publicCat(Stringname,intage){super(name,age);}publicvoideat(){System.out.println(this.name正在吃猫粮);}}publicclassDogextendsAnimal{publicDog(Stringname,intage){super(name,age);}publicvoideat(){System.out.println(this.name正在吃狗粮);}}publicclassTest{publicstaticvoidfunc(Animalanimal){animal.eat();}publicstaticvoidmain(String[]args){DogdognewDog(大黄,5);func(dog);System.out.println();CatcatnewCat(咪咪,3);func(cat);}}由上面的代码可以了解到在同一个函数中调用的参数不同是所产生的结果也是不一样的。即同一个方法不同的对象去做的时候产生的结果也是不同的则称为动态绑定多态Polymorphism的实现确实依赖于动态绑定Dynamic Binding。这是 Java 面向对象编程的核心机制之一。静态绑定publicclassTest{publicstaticintadd(inta,intb){returnab;}publicstaticintadd(inta,intb,intc){returnabc;}publicstaticvoidmain(String[]args){add(1,2);add(1,2,3);}}静态绑定也称为前期绑定(早绑定)即在编译时根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载。多态的优点多态可以运用在循环中来达到代码的简便避免使用大量if-else的循环例如 首先定义下面几个类。classShape{publicvoiddraw(){System.out.println(画图形);}}classRectextendsShape{Overridepublicvoiddraw(){System.out.println(♦);}}classCycleextendsShape{Overridepublicvoiddraw(){System.out.println(●);}}classFlowerextendsShape{Overridepublicvoiddraw(){System.out.println(❀);}}我们现在需要打印的不是一个形状了, 而是多个形状. 如果不基于多态, 实现代码如下publicstaticvoiddrawShapes(){RectrectnewRect();CyclecyclenewCycle();FlowerflowernewFlower();String[]shapes{cycle,rect,cycle,rect,flower};for(Stringshape:shapes){if(shape.equals(cycle)){cycle.draw();}elseif(shape.equals(rect)){rect.draw();}elseif(shape.equals(flower)){flower.draw();}}}如果使用多态实现的话则不需要这么多的if-else循环publicstaticvoiddrawShapes(){// 我们创建了一个 Shape 对象的数组.Shape[]shapes{newCycle(),newRect(),newCycle(),newRect(),newFlower()};for(Shapeshape:shapes){shape.draw();}}
RELATED

相关推荐

【Pytorch】Anaconda: 新建环境出现No module named ‘pip._internal.main‘

【Pytorch】Anaconda: 新建环境出现No module named ‘pip._internal.main‘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/22 22:35:54
【Tensorflow实战系列】Tensorflow:动态库的使用(头文件提取,Makefile链接动态库)

【Tensorflow实战系列】Tensorflow:动态库的使用(头文件提取,Makefile链接动态库)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/22 22:35:54
PJ85718DM与PIC18F85J10协同的HVAC远程温度采集方案

PJ85718DM与PIC18F85J10协同的HVAC远程温度采集方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/22 22:35:54
MORE NEWS

更多资讯

📰

AI搜索优化软件三周实测:数据提升与避坑指南

为内容推广忙活这几年,我对"智能优化""AI一键排名"这类宣传词已经产生了条件反射式的怀疑。这次接触AI搜索优化软件,本来也只打算简单留个记录,结果三周跑下来,它确实让我省掉了大量重复劳动,但同…

📰

241B多模态大模型InternVL3.5部署与微调实战指南

1. 241B的多模态模型,先算清这笔配置账1.1 为什么我把目光从几十B放到了241B多模态模型这几年迭代快得吓人,从最早只会给图片配一句描述,到现在能盯着图表做数据分析、翻着文档找因果关系、对着几帧视频推断过程变化,能力边界一直…

📰

YOLOv8航拍目标检测实战:从8K数据集构建到训练部署全流程

航拍目标检测这几年在应急巡检、智慧交通、农业植保、电力巡线这些场景里用得非常猛。但真正上手做过的人都有体会:把普通的目标检测模型直接搬到无人机拍回来的图上面,效果往往惨不忍睹。一张1080p的航拍照片里,一辆小轿车可能只占二三十个像…

📰

工具手册机器可读重构:人机双轨与六模块实践指南

工具手册这个看似再普通不过的东西,最近差点让我睡不着觉。我们一个自动化巡检项目需要根据内部工具手册判断某个能力的适用范围,手册是有的,还是在线文档,可里面的判断条件全写在表格备注里,写得再清楚人也得一个个读…

📰

多智能体社会实验室:用大模型Agent模拟自发协作与涌现行为

第一次跑通我的“Agent社会实验室”时,屏幕上出现了一个让我愣了很久的画面:一个负责采集木材的Agent,把自己收集到的资源分给了旁边因为连续几天“生病”而行动迟缓的邻居。我反复确认了项目代码,里面没有任何一行写着“互助”“…

📰

基于SpringBoot+Vue的养老公寓管理系统:企业级架构与健康预警闭环解析

做了几年医疗健康类信息化项目,养老公寓管理系统这套东西一直是我觉得“看着简单,做起来全是细节”的典型。很多刚入行的朋友一听到“养老公寓管理系统”,第一反应就是“不就是个带老人信息管理的CRUD吗”。真拿下一个企业级项目的时候&#…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬