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

JavaSE从0到1-DAY4.1-多态实战(ii)

Java 多态实战应用与总结

实战应用

应用1:动物园管理系统

场景描述

一个动物园需要管理不同种类的动物,包括狗、猫、鸟等。需要实现统一的管理接口,但不同动物有不同的行为。

代码实现
// 动物园类classZoo{privateAnimal[]animals=newAnimal[10];privateintcount=0;// 添加动物publicvoidaddAnimal(Animalanimal){if(count<animals.length){animals[count]=animal;count++;}}// 统一喂养所有动物(多态好处一)publicvoidfeedAllAnimals(){System.out.println("🍽️ 开始喂养所有动物...");for(inti=0;i<count;i++){animals[i].eat("营养食物");}}// 显示所有动物信息(多态好处二)publicvoidshowAllAnimals(){System.out.println("📋 动物园中的所有动物:");for(inti=0;i<count;i++){animals[i].showInfo();}}// 执行每种动物特有的操作(多态好处三)publicvoidperformSpecialActions(){System.out.println("🎭 执行每种动物特有的操作:");for(inti=0;i<count;i++){if(animals[i]instanceofDog){Dogdog=(Dog)animals[i];dog.bark();dog.fetch();}elseif(animals[i]instanceofCat){Catcat=(Cat)animals[i];cat.meow();cat.scratch();}elseif(animals[i]instanceofBird){Birdbird=(Bird)animals[i];bird.fly();bird.sing();}}}}// 使用示例Zoozoo=newZoo();zoo.addAnimal(newDog("小白",3,5.0,"金毛"));zoo.addAnimal(newCat("咪咪",2,3.5,"橘色"));zoo.addAnimal(newBird("小鸟",1,0.5,0.3));zoo.feedAllAnimals();zoo.showAllAnimals();zoo.performSpecialActions();
多态的体现
  • 好处一feedAllAnimals()方法接收Animal类型,可以处理所有子类
  • 好处二:同一个showInfo()调用,不同动物显示不同信息
  • 好处三:用Animal[]数组统一存储所有动物

应用2:员工工资计算系统

场景描述

公司有不同类型的员工(经理、开发者、设计师),每种员工的工资计算方式不同。

代码实现
// 员工基类abstractclassEmployee{protectedStringname;protecteddoublebaseSalary;protecteddoublebonus;publicEmployee(Stringname,doublebaseSalary,doublebonus){this.name=name;this.baseSalary=baseSalary;this.bonus=bonus;}publicStringgetName(){returnname;}publicdoublegetBaseSalary(){returnbaseSalary;}publicdoublegetBonus(){returnbonus;}// 抽象方法:计算工资publicabstractdoublecalculateSalary();}// 经理类classManagerextendsEmployee{publicManager(Stringname,doublebaseSalary,doublebonus){super(name,baseSalary,bonus);}@OverridepublicdoublecalculateSalary(){// 经理工资 = 基本工资 + 奖金 + 管理补贴returnbaseSalary+bonus+500;}}// 开发者类classDeveloperextendsEmployee{publicDeveloper(Stringname,doublebaseSalary,doublebonus){super(name,baseSalary,bonus);}@OverridepublicdoublecalculateSalary(){// 开发者工资 = 基本工资 + 奖金 + 技术补贴returnbaseSalary+bonus+300;}}// 设计师类classDesignerextendsEmployee{publicDesigner(Stringname,doublebaseSalary,doublebonus){super(name,baseSalary,bonus);}@OverridepublicdoublecalculateSalary(){// 设计师工资 = 基本工资 + 奖金 + 创意补贴returnbaseSalary+bonus+200;}}// 使用示例Employee[]employees={newManager("张三",5000,2000),newDeveloper("李四",8000,1000),newDesigner("王五",6000,500)};doubletotalSalary=0;for(Employeeemp:employees){doublesalary=emp.calculateSalary();System.out.println(emp.getName()+" - 工资:"+salary);totalSalary+=salary;}System.out.println("公司总工资:"+totalSalary);
多态的体现
  • 不同员工类型有不同的工资计算方式
  • 用一个循环处理所有员工
  • 易于扩展:新增员工类型只需继承Employee并重写calculateSalary()

应用3:图形计算系统

场景描述

计算不同图形的面积,包括圆形、矩形、三角形等。

代码实现
// 图形基类abstractclassShape{publicabstractdoublecalculateArea();publicabstractStringgetShapeName();}// 圆形类classCircleextendsShape{privatedoubleradius;publicCircle(doubleradius){this.radius=radius;}@OverridepublicdoublecalculateArea(){returnMath.PI*radius*radius;}@OverridepublicStringgetShapeName(){return"圆形(半径:"+radius+")";}}// 矩形类classRectangleextendsShape{privatedoublewidth;privatedoubleheight;publicRectangle(doublewidth,doubleheight){this.width=width;this.height=height;}@OverridepublicdoublecalculateArea(){returnwidth*height;}@OverridepublicStringgetShapeName(){return"矩形(宽:"+width+",高:"+height+")";}}// 三角形类classTriangleextendsShape{privatedoublea,b,c;publicTriangle(doublea,doubleb,doublec){this.a=a;this.b=b;this.c=c;}@OverridepublicdoublecalculateArea(){// 使用海伦公式计算三角形面积doubles=(a+b+c)/2;returnMath.sqrt(s*(s-a)*(s-b)*(s-c));}@OverridepublicStringgetShapeName(){return"三角形(边长:"+a+","+b+","+c+")";}}// 使用示例Shape[]shapes={newCircle(5),newRectangle(4,6),newTriangle(3,4,5)};doubletotalArea=0;for(Shapeshape:shapes){doublearea=shape.calculateArea();System.out.println(shape.getShapeName()+" - 面积:"+String.format("%.2f",area));totalArea+=area;}System.out.println("所有图形总面积:"+String.format("%.2f",totalArea));
多态的体现
  • 不同图形有不同的面积计算方式
  • 用一个循环处理所有图形
  • 易于维护和扩展

常见错误

❌ 错误1:直接调用子类特有方法

// 错误代码Animala=newDog(...);a.bark();// ❌ 编译错误!Animal 没有 bark() 方法// 正确做法if(ainstanceofDog){Dogd=(Dog)a;d.bark();// ✅}

原因:编译时检查引用类型(Animal),Animal 没有bark()方法


❌ 错误2:转换类型与实际类型不符

// 错误代码Animalcat=newCat(...);Dogd=(Dog)cat;// ❌ ClassCastException// 正确做法if(catinstanceofDog){Dogd=(Dog)cat;}elseif(catinstanceofCat){Catc=(Cat)cat;}

原因:cat 的实际类型是 Cat,不能转换成 Dog


❌ 错误3:忘记向下转型

// 错误代码Animal[]animals={newDog(...),newCat(...)};for(Animala:animals){a.bark();// ❌ 编译错误!}// 正确做法for(Animala:animals){if(ainstanceofDog){((Dog)a).bark();// ✅}}

原因:需要先转换成子类类型才能调用子类特有方法


❌ 错误4:混淆多态和重载

// 错误理解:以为这是多态publicclassTest{publicvoidmethod(Animala){}publicvoidmethod(Dogd){}}// 这是重载,不是多态!// 多态是在继承关系中,方法重写后的运行时行为// 正确的多态Animala=newDog(...);a.eat(...);// 运行时执行 Dog 的 eat() 方法

原因:重载是编译时确定,多态是运行时确定


速记口诀

🎯 核心口诀

多态三前提:继承、重写、父引子对 编译运行时:编译左边,运行右边 向下转型:instanceof 先判断,再转换 多态好处:一个方法,多种实现

📝 详细记忆

口诀含义
继承子类必须继承父类
重写子类必须重写父类方法
父引子对父类引用指向子类对象
编译左边编译时检查引用类型
运行右边运行时执行实际对象的方法
instanceof 先判向下转型前必须判断类型
一个方法多种实现多态的核心优势

总结

多态的本质

多态就是同一个方法调用,由于对象不同,会执行不同的代码。

多态的核心

  • 编译时看左边(引用类型)
  • 运行时看右边(实际对象类型)

多态的优势

优势说明
灵活性一个方法可以处理多种类型
可维护性代码结构清晰,易于理解
可扩展性新增类型时无需修改现有代码
代码复用减少代码重复

学习建议

  1. 理解三个前提条件

    • 必须有继承关系
    • 必须有方法重写
    • 必须有父类引用指向子类对象
  2. 掌握类型转换

    • 向上转型:自动进行,安全
    • 向下转型:需要强制转换,需要判断
  3. 记住核心规则

    • 编译看左边,运行看右边
    • 向下转型前一定要用 instanceof 判断
  4. 多做练习

    • 理解多态的实际应用
    • 学会在项目中使用多态
  5. 避免常见错误

    • 不要直接调用子类特有方法
    • 不要转换类型与实际类型不符
    • 不要忘记向下转型

对比总结表

多态 vs 继承 vs 重载

特性多态继承重载
定义同一方法不同实现子类获得父类特性同名方法不同参数
关系父子类父子类同一类
决定时机运行时编译时编译时
目的实现灵活调用代码复用提供便利
方法名相同相同相同
参数相同相同不同

最后的话

多态是Java面向对象编程的三大特性之一(继承、封装、多态),也是最重要的特性。

掌握多态的关键

  • 理解"编译看左边,运行看右边"
  • 学会使用 instanceof 和向下转型
  • 在实际项目中多使用多态

多态的力量

  • 让代码更灵活
  • 让代码更易维护
  • 让代码更易扩展

记住这句话

“多态是面向对象编程的灵魂,掌握多态就掌握了Java的精髓。”

http://www.jsqmd.com/news/564093/

相关文章:

  • Seurat与DoubletFinder联用:构建自动化双胞过滤流水线
  • Matlab闪退弹窗stopped working and needs to close
  • WinDiskWriter:Mac用户制作Windows启动盘的零门槛开源工具
  • PP-DocLayoutV3教育场景:教材/试卷图片中竖排文本+图表+公式同步解析
  • Lingbot-Depth-Pretrain-Vitl-14 保姆级教程:Ubuntu 20.04 系统环境配置
  • 华为OD机考双机位C卷 - 最左侧冗余覆盖子串 (Java)
  • 弦音墨影保姆级教程:解决‘视频加载失败’‘墨迹不跟随目标’等10类高频问题
  • 忍者像素绘卷Z-Image-Turbo模型优化原理:线条锐化与色彩分层技术
  • 2026年防爆门厂家选择:我的实践案例与避坑分享
  • Loop窗口管理工具:Mac多任务处理的终极解决方案
  • ComfyUI节点连接报错?一文搞懂‘条件’与‘文本’数据类型的区别与转换
  • DDColor效果展示:同一张黑白照,不同语义引导下的5种风格化着色结果
  • 完全离线语音处理:基于AnythingLLM的本地化语音转文字开源方案
  • Qwen3-ASR-0.6B部署教程:Ubuntu 22.04 + NVIDIA驱动 + Docker全链路
  • 依然似故人_孙珍妮文生图模型教程:Z-Image-Turbo LoRA提示词中英文混合写法技巧
  • 复古像素UI设计哲学:像素极光引擎大气/明亮/交互三原则技术实现
  • 2026年口碑好的电子级无水乙醇/工业级无水乙醇制造厂家推荐 - 行业平台推荐
  • StructBERT效果实测:错别字容错能力惊人,相似度计算准确率高
  • Z-Image-Turbo-rinaiqiao-huiyewunv入门指南:Streamlit会话状态管理避免多用户并发冲突
  • Qwen-Image-2512-Pixel-Art-LoRA 结合YOLOv8:智能识别并生成场景像素画
  • CLIP-GmP-ViT-L-14保姆级教程:日志分析+性能压测+异常恢复全链路运维指南
  • 3分钟上手Fast-F1:Python赛车数据分析实战指南
  • Edge浏览器批量下载GLASS数据集全攻略:DownThemAll插件+Python脚本双保险
  • 2026年质量好的光谱纯无水乙醇/实验室用无水乙醇/高纯无水乙醇精选厂家 - 行业平台推荐
  • 颠覆式RimWorld模组管理工具:RimSort智能排序与冲突检测解决方案
  • 基于文案自动匹配素材的视频生成系统
  • 静态图编译失败率高达63%?实测27种模型结构+8类硬件配置,PyTorch 3.0分布式训练避坑清单来了
  • 2026宠物医院美团代运营:这些机构运营更专业,宠物店美团推广/宠物服务推广,宠物医院美团代运营机构推荐 - 品牌推荐师
  • 从理论到实践:深入解析RAIM算法及其在GNSS完好性监测中的应用
  • Java数据结构:Map与Set