多态的基本认识和了解

发布时间:2026/10/22 22:42:05

多态的基本认识和了解 多态的概念多态的概念通俗来说就是多种形态具体点就是去完成某个行为当不同的对象去完成时会产生出不同 的状态。总的来说就是同一件事发生在不同的对象上产生不同的结果多态实现的条件在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();}}
延伸阅读

更多相关文章

2026/10/22 22:32:03

【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:32:03

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/23 0:02:26

Rust正成为AI基础设施的底层新标准

1. 项目概述:这不是技术风向标,而是基建层的静默迁移“3个信号:AI基建正在转向Rust”——这句话最近在多个技术社区高频出现,但很多人读完标题只留下模糊印象:哦,Rust又火了?AI圈开始用Rust了&a…

2026/10/23 0:02:26

Rust为何成为AI基础设施的确定性选择

1. 这不是技术风潮,是基建层的静默迁移最近在几个核心开源项目的更新日志里反复看到同一个现象:原本用Go写的CLI工具,新版本悄悄换成了Rust;某知名云原生中间件的v2.0架构图里,底层数据平面模块标注着“Rust重写中”&a…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/22 23:57:26

SQL注入原理与防御实战:从数据库安全到参数化查询的完整指南

1. SQL注入到底是什么:从一道“不该通过”的登录说起聊SQL注入之前,先讲一个我早年做项目时遇到的真实案例。某公司内部系统上线没多久,运维反馈后台登录接口响应偶尔很慢,偶尔又很快,而且数据库负载波动明显。一开始怀…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

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

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

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