Java面向对象进阶—多态

发布时间:2026/10/25 9:10:05

Java面向对象进阶—多态 目录1.认识多态2.多态中调用成员的特点3.多态的优势和弊端1.认识多态多态是面向对象的三大特征的最后一个那么我们先了解什么是多态呢实际上就是同类型的对象表现出不同形态。多态的表现形式父类类型 对象名称子类对象。多态的前提1.有继承关系2.有父类引用指向子类对象 Fu fnew Zi();3.有方法重写可以先体会一下多态当我们在IDEA中创建了四个类AdministratorPersonStudentTeacher这四个类之后Person类中有基础的show方法然后每个类中都重写一个新的show方法当我们在Test类中进行测试的时候public class Test { public static void main(String[] args) { //创建三个对象并调用register方法 Student s new Student(); s.setName(张三); s.setAge(18); Teacher t new Teacher(); t.setName(王建国); t.setAge(30); Administrator admin new Administrator(); admin.setName(管理员); admin.setAge(35); register(s); register(t); register(admin); } //这个方法既能接收老师又能接收学生还能接收管理员 //只能把参数写成这三个类型的父类 public static void register(Person p){ p.show(); } } /* 运行输出 学生的信息为张三, 18 老师的信息为王建国, 30 管理员的信息为管理员, 35 */2.多态中调用成员的特点变量调用编译看左边运行也看左边方法调用编译看左边运行看右边public class Test { public static void main(String[] args) { //创建对象多态方式 //Fu fnew Zi(); Animal a new Dog(); //调用成员变量编译看左边运行也看左边 //编译看左边Javac在编译代码的时候会先看左边的父类中有没有这个变量如果有编译成功如果没有则编译失败 //运行也看左边Java运行代码的时候实际获取的是左边父类中成员变量的值 System.out.println(a.name);//动物 //调用成员方法编译看左边运行看右边 //编译看左边同上 //运行看右边运行代码的时候是运行子类中的方法 a.show();//Dog --- show方法 } } class Animal{ String name 动物; // public void show(){ // System.out.println(Animal --- show方法); // } } class Dog extends Animal{ String name 狗; //Override public void show() { System.out.println(Dog --- show方法); } } class Cat extends Animal{ String name 猫; //Override public void show() { System.out.println(Cat --- show方法); } }对于这个该怎么理解呢Animal a new Dog();现在是用a去调用变量和方法的而a是Animal类型的所以默认都会从Animal这个类中去找。对于成员变量来说由于子类和父类是继承关系在子类的对象中会把父类的成员变量也继承下的。比如说父name子name的情况下a.name是调用的父因为在Animal类中。对于成员方法来说如果子类对方法进行了重写那么在虚方法表中会把父类的方法进行覆盖但是实际上还是调用的父方法所以是编译看右边了。我们可以再通过内存图来加深一下想法首先我们是先创建了Animal类然后又用Dog类继承了Animal。然后我们代码往下走在方法区写了Test的主函数。先利用多态创建a是Animal类的然后在方法区加载了Animal和Dog类。注意在Dog类中的show是重写过后的。然后我们会在堆中创建空间分别存父类和子类的name因为这个我们是Animal类的a嘛所以当a.name的时候就会去打印出来“动物”。如果我们是之前的方法Dog dnew Dog()这种方法那我们就是直接访问的子类的name如果子类中没有才会去看父类中的name。当利用show的时候根据调用方法的特点也是直接看重写的show。3.多态的优势和弊端优势1.在多态形势下右边对象可以实现解耦合便于扩展和维护Person pnew Student(); p.work();//当业务逻辑发生改变时后续代码无需修改当我这个不想执行student的work了我想改成teacher的就只需要把第一行后边这个new student改成teacher就可以了。2.定义方法的时候使用父类型作为参数可以接收所有子类对象体现多态的扩展性与便利。可以看在StringBuilder里sb.append就可以直接添加object类型方便了使用。那么多态有什么弊端呢多态弊端父类引用不能直接调用子类独有的方法public class Test { public static void main(String[] args) { //创建对象多态父类引用指向子类对象 Animal a new Dog(); //编译看左边运行看右边执行Dog重写后的eat() a.eat(); //多态弊端父类引用不能直接调用子类独有的方法 //a.lookHome(); //这行会编译报错Animal类中没有lookHome方法 //如果要调用子类特有方法需要向下转型 Dog d (Dog) a; d.lookHome(); //多态父类引用指向Cat子类对象 Animal c new Cat(); c.eat(); //向下转型调用猫特有方法 Cat cat (Cat) c; cat.catchMouse(); } } class Animal{ public void eat(){ System.out.println(动物在吃东西); } } class Dog extends Animal{ Override public void eat() { System.out.println(狗吃骨头); } //Dog子类特有方法 public void lookHome(){ System.out.println(狗看家); } } class Cat extends Animal{ Override public void eat() { System.out.println(猫吃小鱼干); } //Cat子类特有方法 public void catchMouse(){ System.out.println(猫抓老鼠); } }还是刚才的代码如果我想转换类型该怎么做利用instanceof这个关键字进行判断在Java17之后就可以不用再单独写转换直接在判断框内写就可以了public class Test { public static void main(String[] args) { Animal a new Dog(); a.eat(); // ---------------- 旧版本写法 ---------------- /* if(a instanceof Dog){ Dog d (Dog) a; d.lookHome(); }else if(a instanceof Cat){ Cat c (Cat) a; c.catchMouse(); }else{ System.out.println(没有这个类型无法转换); } */ // ---------------- Java17 新模式匹配写法 ---------------- if(a instanceof Dog d){ d.lookHome(); }else if(a instanceof Cat c){ c.catchMouse(); }else{ System.out.println(没有这个类型无法转换); } // 测试Cat对象 Animal b new Cat(); b.eat(); if(b instanceof Dog d){ d.lookHome(); }else if(b instanceof Cat c){ c.catchMouse(); }else{ System.out.println(没有这个类型无法转换); } } }
延伸阅读

更多相关文章

2026/10/24 9:12:41

eDNA水体样品采集时可以检测的水质指标

检测水质指标可以告诉我们这个水体处于什么环境状态?有没有富营养化、有机污染、盐分/离子增加、缺氧等问题?这些变化有没有可能影响动物或植物群落?指标主要告诉你什么高/低可能意味着什么水温水体热环境高温、季节变化、热污染pH酸碱环境酸…

2026/10/24 14:47:17

94.RAG-RAG应用平台-Dify工作流(大模型和知识库使用说明)

内容参考于:图灵AI大模型全栈 Dify源码地址:https://github.com/langgenius/dify 中文文档:https://docs.dify.ai/v/zh-hans 官方地址: https://cloud.dify.ai/apps 下图蓝框的上一节中写完了,接下来是下图红框的两个 工作流 它是…

2026/10/25 13:59:24

中兴通讯CDO崔丽:全栈TCO最优成为AI基础设施竞争的关键

5月30日, 中兴通讯有一位首席发展官名叫崔丽, 她受到邀请, 出席了在澳门举办的Expo系列活动。在一场名为数字AI峰会也就是AI的活动里, 有一个开场的炉边对话, 主题是“基础设施赋能AI进化”, 在这个对话当中, 她针对多个议题, 和主持人艾诚进行了深入分享, 这些议题包括AI产业演…

2026/10/25 14:14:36

多Agent系统通信基建:Agent-Reach轻量级触达层设计与实战

先交代一个背景:最近几个月我一直在做多Agent系统的落地项目,踩了不少坑,也沉淀了一套自己的通信与编排方案,也就是标题里这个 Agent-Reach。它不是一个大而全的AI框架,而是一个专注解决“Agent之间怎么找到对方、怎么…

2026/10/25 14:14:36

HCIP-Cloud Computing题库:华为云Stack能力校准与故障排查指南

简介:本资源是华为HCIP-云计算(V-H13-527 5.0)认证考试的高覆盖题库文档,专为备考HCIP-Cloud Computing工程师设计,聚焦虚拟化、FusionCompute平台运维、桌面云架构及HCI集成等核心能力。题库含25道以上典型单选题&…

2026/10/25 14:14:36

计算机视觉实训软件选型指南:300人大班教学与14大技术主题实践

1. 计算机视觉实训软件选型背后的真实需求拆解1.1 从“300人大班教学”倒推出来的硬性约束看到“支持300人的大班教学”这个描述,我第一反应不是觉得这个数字有多夸张,而是立刻意识到它背后隐藏着一整套非常具体的工程约束。做过高校实验室或者企业内训的…

2026/10/25 14:14:36

WorkBuddy:基于MCP协议的可编程AI工作台

1. WorkBuddy不是AI聊天框,而是可编程的智能工作台WorkBuddy这个词最近在开发者圈子里火得有点突然——不是因为某个大厂发布了新模型,而是因为它彻底改写了“AI助手”这个概念的物理形态。它不走ChatGPT那种纯对话流路线,也不像Copilot那样嵌…

2026/10/25 14:14:36

Agent原生知识库:本地优先与纯Markdown存储的长期记忆方案

最近朋友圈和技术群里聊Agent的频率明显高了,但大多数人手里的知识库方案,其实还停留在“给人工客服看文档”的层面。我在本地跑智能体的时候越来越确认一件事:给Agent用的知识库,跟给人用的知识库,完全是两回事。今天…

2026/10/25 14:09:35

图像生成模型左右不分?用绝对坐标锚定法根治方向失控

最近大半年,我几乎每天都要跟图像生成模型打交道,被问得最多的问题里,“左右不分”绝对排得上号。你明明写了一句“猫在左边,狗在右边”,出的图十有八九是猫狗换边;写“人物面朝左侧”,他能给你…

2026/10/25 0:02:22

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/25 0:02:23

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/25 0:02:23

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/25 0:02:22

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/25 0:02:23

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/25 0:02:23

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

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

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

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