恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

13-多态和抽象

  • 首页
  • 资讯中心
  • /
  • 13-多态和抽象

相关资讯

SpringCloud+Vue商城实战:从启动失败到下单贯通的分布式排障指南 2026/10/18 23:47:55
LabVIEW+USBCAN实现车规级UDS诊断协议栈落地 2026/10/18 23:47:55
EZCAD2二次开发核心:MarkEzd.dll与C#激光打标自动化 2026/10/18 23:42:54

最新资讯

ASP.NET MVC工作流管理系统源码解析:流程引擎与表单设计器实战
Rocky Linux 8.5部署Jenkins:跨平台CI/CD与容器化构建实战
CH341A+NeoProgrammer刷BIOS:救砖、备份与排错指南
Selenium元素底层逻辑:属性、定位、等待与异常排查全解析
diagram-design:用代码思维管理图表,提升可维护性与一致性
MATLAB实现电力系统潮流计算:从导纳矩阵到牛顿法收敛

今日推荐

OpenCowork 实测:支持本地文件、飞书机器人的 Windows AI 助手(只需配置 Token)
GPT-6 Sol 与 Luna 怎么选?Chat、Work、Codex 版本差异与 TaoToken 接入实测
openclaw.net 集成 ElBruno.MempalaceNet 记忆系统:把 MCP 配置改到 TaoToken 的完整实践

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

13-多态和抽象

发布时间:2026/10/18 23:47:55
13-多态和抽象 多态什么是多态多态的表现形式多态的前提示例多态的好处多态调用成员的特点变量调用方法调用多态的弊端类型转换强制类型转换的注意事项instanceof关键字示例多态联系练习一抽象类和抽象方法定义格式小贴士示例注意事项配套完整代码GitHub仓库https://github.com/LIN-commit/java-learning代码所在目录java-learning/polymorphic_and_abstract/多态什么是多态多态事物的多种形态Student stu new Student();该对象为Student学生形态Person per new Student();该对象实际类型是Student,只是被Person类型的引用变量指向了是多态的典型写法多态的表现形式父类类型 对象名称 子类对象;多态的前提有继承/实现关系有父类引用指向子类对象Fu f new Zi();示例题目学生类属性姓名账号密码行为work:学生的工作是学习老师类属性姓名账号密码行为work:老师的工作是教书学生管理系统行为注册register要求能注册所有的角色输出姓名为张三的同学注册成功账号zhangsan密码123456对应package:example1对应代码Person.javaStudent.javaTeacher.javaStudentManager.javaTest.javapackageexample1;publicclassPerson{privateStringname;privateStringnumber;privateStringpassword;publicPerson(){}publicPerson(Stringname,Stringnumber,Stringpassword){this.namename;this.numbernumber;this.passwordpassword;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicStringgetNumber(){returnnumber;}publicvoidsetNumber(Stringnumber){this.numbernumber;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.passwordpassword;}publicvoidwork(){System.out.println(work);}}packageexample1;publicclassStudentextendsPerson{publicStudent(){}publicStudent(Stringname,Stringnumber,Stringpassword){super(name,number,password);}Overridepublicvoidwork(){System.out.println(学生的工作是学习);}}packageexample1;publicclassTeacherextendsPerson{publicTeacher(){}publicTeacher(Stringname,Stringnumber,Stringpassword){super(name,number,password);}Overridepublicvoidwork(){System.out.println(老师的工作是教书);}}packageexample1;publicclassStudentManager{publicvoidregister(Personperson){System.out.println(姓名为person.getName()的账户注册成功账号为person.getNumber()密码person.getPassword());person.work();}}packageexample1;publicclassTest{publicstaticvoidmain(String[]args){PersonstunewStudent(张三,zhangsan,123456);StudentManagersnewStudentManager();s.register(stu);PersontnewTeacher(蓝猫学姐,bluecat,456789);s.register(t);}}[运行结果]姓名为张三的账户注册成功账号为zhangsan密码123456 学生的工作是学习 姓名为蓝猫学姐的账户注册成功账号为bluecat密码456789 老师的工作是教书多态的好处方法中使用父类型作为参数可接收父类对象所有子类对象如果子类中进行方法重写利用多态调用方法可以调用不同子类中重写的方法多态调用成员的特点变量调用编译看左边运行也看左边方法调用编译看左边运行看右边变量调用publicclassFu{Stringnamefu;}publicclassZiextendsFu{Stringnamezi;}FufnewZi();System.out.println(f.name);[运行结果]fu编译看左边把java文件编译成class文件的时候看父类当中有没有这个变量如果有则编译成功没有就编译失败在上述代码中就看父类中有没有name这个变量运行也看左边在代码真正运行的时候使用父类中的变量所以上述代码的运行结果是fu方法调用编译看左边在父类中有没有这个方法如果没有代码报错运行看右边在代码真正运行的时候运行的是子类里面的方法如果子类没有重写父类里面的方法使用的还是父类中的方法publicclassFu{publicvoidmethod(){System.out.println(fu);}}publicclassZiextendsFu{publicvoidmethod(){System.out.println(zi);}}publicclasstest{publicstaticvoidmain(String[]args){FusnewZi();s.method();}}[运行结果]zi多态的弊端多态下不能使用子类的独有功能类型转换自动类型转换从子到父子类对象赋值给父类类型的变量强制类型转换从父到子子类 对象变量 子类父类类型的变量PersonpnewStudent();Students(Student)p;作用可以解决多态的弊端可以实现调用子类的独有功能强制类型转换的注意事项转换类型与真实类型不一致会报错转换的时候用instanceof关键字进行判断instanceof关键字示例对应package:example2对应代码Person.javaFu.javaZi.javaTest.javapackageexample2;publicclassPerson{publicvoidshow(){System.out.println(Person中的show方法被调用了);}}packageexample2;publicclassFuextendsPerson{publicvoidfushow(){System.out.println(Fu类中独有的fushow方法被调用了);}}packageexample2;publicclassZiextendsFu{publicvoidzishow(){System.out.println(zi类中独有的zishow方法被调用了);}}packageexample2;publicclassTest{publicstaticvoidmain(String[]args){PersonpnewFu();/* 此时p的实际类型是Fu 但是遵循“调用方法编译看左边运行看右边” 所以如果想要调用Fu类中独有而Person类中没有的方法就要把p强制转为Fu类型 *///p.fushow();//报错因为Person类中没有fushow方法//Zi z (Zi)p;//编译不会报错但运行会报错//用instanceof关键字判断p是否是Fu类型if(pinstanceofFu){Fuf(Fu)p;}else{System.out.println(请确定好类型再进行转换);}}}多态联系练习一题目自行车属性品牌行驶速度行为移动move响铃ringBell汽车属性品牌行驶速度行为移动move鸣笛honk人属性名字年龄性别行为行驶交通工具能使用所有交通工具测试类中创建Person对象让这个人使用任意一款交通工具 、对应package:example3对应代码Transport.javaBike.javaCar.javaPerson.javaTest.javapackageexample3;publicclassTransport{privateStringbrand;privatedoublespeed;publicTransport(){}publicTransport(Stringbrand,doublespeed){this.brandbrand;this.speedspeed;}publicStringgetBrand(){returnbrand;}publicvoidsetBrand(Stringbrand){this.brandbrand;}publicdoublegetSpeed(){returnspeed;}publicvoidsetSpeed(doublespeed){this.speedspeed;}publicvoidmove(){System.out.println(brank交通工具正以speedkm/h的速度移动);}}packageexample3;publicclassBikeextendsTransport{publicBike(){}publicBike(Stringbrand,doublespeed){super(brand,speed);}Overridepublicvoidmove(){System.out.println(getBrand()的自行车正以getSpeed()km/h的速度移动);}publicvoidringBell(){System.out.println(铃铃铃~);}}packageexample3;publicclassCarextendsTransport{publicCar(){}publicCar(Stringbrand,doublespeed){super(brand,speed);}Overridepublicvoidmove(){System.out.println(getBrand()的汽车正以getSpeed()km/h的速度移动);}publicvoidhonk(){System.out.println(嘟嘟嘟~);}}packageexample3;publicclassPerson{privateStringname;privateintage;privateStringgender;publicPerson(){}publicPerson(Stringname,intage,Stringgender){this.namename;this.ageage;this.gendergender;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.ageage;}publicStringgetGender(){returngender;}publicvoidsetGender(Stringgender){this.gendergender;}publicvoiduse(Transportt){t.move();//现在并不知道调用的是bike还是car所以不确定是鸣笛还是响铃if(tinstanceofBike){Bikeb(Bike)t;b.ringBell();}elseif(tinstanceofCar){Carc(Car)t;c.honk();}else{System.out.println(没有这个类型);}}}packageexample3;publicclassTest{publicstaticvoidmain(String[]args){PersonpnewPerson(蓝猫学姐,20,女);System.out.println(p.getName(), p.getAge(), p.getGender());BikebnewBike(迪卡侬,5);p.use(b);CarcnewCar(大众,20);p.use(c);}}[运行结果]蓝猫学姐, 20, 女 迪卡侬的自行车正以5.0km/h的速度移动 铃铃铃~ 大众的汽车正以20.0km/h的速度移动 嘟嘟嘟~抽象类和抽象方法定义抽象方法将共性的行为方法抽取到父类之后因为每一个子类的方法体是不一样的所以在父类中不能确定具体的方法体。该方法就可以定义为抽象方法抽象类如果一个类中存在抽象方法那么该类就必须申明为抽象类格式抽象方法public abstract 返回值类型 方法名参数列表抽象类public abstract class 类名{...}小贴士alt回车自动修复代码中的bug示例题目猫类属性名字颜色行为猫吃鱼猫抓老鼠猫喝水狗类属性名字颜色行为狗吃骨头狗看家狗喝水对应package:example4对应代码Animal.javaCat.javaDog.javaTest.javapackageexample4;publicabstractclassAnimal{privateStringname;privateStringcolor;publicAnimal(){}publicAnimal(Stringname,Stringcolor){this.namename;this.colorcolor;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicStringgetColor(){returncolor;}publicvoidsetColor(Stringcolor){this.colorcolor;}//eat抽象方法publicabstractvoideat();//喝水行为publicvoiddrink(){System.out.println(喝水);}}packageexample4;publicclassCatextendsAnimal{publicCat(){}publicCat(Stringname,Stringcolor){super(name,color);}Overridepublicvoideat(){System.out.println(猫吃鱼);}publicvoidcatchMouse(){System.out.println(猫抓老鼠);}}packageexample4;publicclassDogextendsAnimal{publicDog(){}publicDog(Stringname,Stringcolor){super(name,color);}Overridepublicvoideat(){System.out.println(狗吃骨头);}publicvoidlookHome(){System.out.println(狗看家);}}packageexample4;publicclassTest{publicstaticvoidmain(String[]args){CatcnewCat(小白,白色);System.out.println(c.getName(), c.getColor());c.eat();c.catchMouse();c.drink();System.out.println(-----------);DogdnewDog(大黄,黄色);System.out.println(d.getName(), d.getColor());d.eat();d.lookHome();d.drink();}}[运行结果]小白, 白色 猫吃鱼 猫抓老鼠 喝水 ----------- 大黄, 黄色 狗吃骨头 狗看家 喝水注意事项抽象类不能实例化Animal a new Animal();是错误的抽象类中不一定有抽象方法作用为了不让外界创建本类的对象有抽象方法的类一定是抽象类抽象类中可以有构造方法构造方法的作用为了给成员变量赋值抽象类的子类要么重写抽象类中所有的抽象方法要么子类也是抽象类以上就是面向对象中的多态和抽象内容了。下一篇我们将学习接口欢迎继续关注蓝猫学姐的java学习笔记~

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号