面向对象------多态

1.多态的定义

通俗来说,当同一种行为或者事情发生在不同的对象上,这些行为或者事情最终得到的结果不同

注意:多态要发生在继承的基础上。

例如:彩色打印机和黑白打印机。

彩色打印机和黑白打印机是不同的对象,但打印(行为)这件事分别发生在它们身上的时候,彩色打印机打印的是彩色的,而黑白打印机最终打印的结果却是黑白色的。

9d2c6dfbc7b140c69b09ee67f3d2d610.jpeg

对应到Java中就是相同的方法对应到不同的对象中有不同的结果。

 2.多态的使用

2.1 向上转型

向上转型发生在继承的基础上,所谓向上转型,就是由子类类型向父类类型转换。向上转型的方式由3中,分别为:直接赋值、方法的传参和方法的返回值形式。

cd27b6ff42c54f478357c0f945739ffd.png

1.直接传参

class Animal{}
class Dog extends Animal{}
public class Test {public static void main(String[] args) {//直接赋值,发生向上转型Animal animal=new Dog();}
}

2. 方法的传参

class Animal{}
class Dog extends Animal{}
public class Test {public static void func(Animal animal){}public static void main(String[] args) {Dog dog=new Dog();//方法的传参实现向上转型func(dog);}
}

3.方法的返回值

class Animal{}
class Dog extends Animal{}
public class Test {public static Animal func(){Dog dog=new Dog();return dog;}public static void main(String[] args) {Animal animal=func();   }
}

4 向上转型的缺点

当我们进行了向上转型,我们就不能通过父类的引用(转型之后的引用)去访问子类特有的属性或者方法。 

class Dog extends Animal{public Dog(String name,int age){super(name, age);}public void bark(){System.out.println(this.name+"在汪汪叫");}
}
class Animal{public String name;public int age;public Animal(String name,int age){this.name=name;this.age=age;}
}
public class Test {public static void main(String[] args) {Animal animal=new Dog("旺财",18);animal.bark();}
}

运行以上代码会报错

3a35aad63445466885f9c1362e88f5fe.png

 2.2 动态绑定

动态绑定是理解多态的基础。

 1.方法的重写

当子类和父类中有一个方法名字一样,参数列表一样和返回值类型一样,但是方法内不得具体实现不一样,则子类对应的方法构成了方法的重写。

class Dog extends Animal{public Dog(String name,int age){super(name, age);}@Override  //编译器中方法重写的默认注释public void eat() {System.out.println(this.name+"在吃狗粮");}
}
class Animal{public String name;public int age;public Animal(String name,int age){this.name=name;this.age=age;}public void eat(){System.out.println(this.name+"在吃饭");}
}
public class Test {public static void main(String[] args) {Animal animal=new Dog("旺财",18);}
}

576d89fe0853486e98df4213b8c9be63.png

如上图,红框框里面就是构成重写的部分。

2.方法重写的注意事项

1.重写的方法不能是一个静态的方法(被static修饰的方法)。

28c19be6474e4253a98792d78ccb6458.png

2.被final修饰的方法无法被重写

f62da0c70ea540acabba5dd3c82d2a38.png

3.如果子类重写父类的方法时,子类重写方法时的访问权限要大于等于父类方法的权限。

                                    访问权限大小比较
                          public>protected>default>private

bb77810d585141edb5bb2f574fc883d7.png

如图,因为父类要被重写的方法得访问权限为public,而子类中重写的方法的访问权限为private,所以运行代码时,编译器会报错。

4.父类中被private修饰的方法无法被重写

1b6abd7d39a849839ceeb30887da433e.png

5.重写的方法的返回值类型可以不相同,但是返回值类型必须构成父子类的关系。

b86f870320124880b8e861f5bc099294.png

                         

3. 方法的重写和重载的区别

                         重载                      重写
   参数列表中的数据类型,顺序和个priv数可以不一样 参数列表中的数据类型,顺序和个数必须一样
   返回值的类型不一样  返回值类型必须一样
   方法名必须一样   方法名必须一样

4.动态绑定

当运行代码时,我们通过父类的引用去调用在子类和父类中重写的方法,结果实际调用了子类的方法,这种情况就被称为动态绑定。

 代码演示

class Dog extends Animal{public Dog(String name,int age){super(name, age);}@Override  //编译器中方法重写的默认注释public void eat() {System.out.println(this.name+"在吃狗粮");}
}
class Animal{public String name;public int age;public Animal(String name,int age){this.name=name;this.age=age;}public void eat(){System.out.println(this.name+"在吃饭");}
}
public class Test {public static void main(String[] args) {Animal animal=new Dog("旺财",18);animal.eat();}
}

运行代码

3131275c2b1940e5a641801a54ebc4f8.png

通过上面代码,我们发现,当我们完成了向上转型之后,我们通过父类的引用去调用重写的方法时,程序在编译时,调用的确实是父类的eat( )方法。但是由于动态绑定,最终我们看到的是Dog类中的eat( )方法。

 2.3 向下转型

向下转型也是发生在继承的继承的基础上,向下转型就是父类向子类转换。

019109a214b24964aa6670dc6a75a062.png

 1.向下转型的优点

通过向下转型,我们就可以访问子类中特有的属性和方法。

代码演示

class Dog extends Animal{public Dog(String name,int age){super(name, age);}@Override  //编译器中方法重写的默认注释public void eat() {System.out.println(this.name+"在吃狗粮");}public void run(){System.out.println(this.name+"会跑");}
}
class Bird extends Animal{public Bird(String name, int age) {super(name, age);}public void eat(){System.out.println(this.name+"在吃鸟粮");}public void fly(){System.out.println(this.name+"会飞");}
}
class Animal{public String name;public int age;public Animal(String name,int age){this.name=name;this.age=age;}public void eat(){System.out.println(this.name+"在吃饭");}
}
public class Test {public static void main(String[] args) {Animal animal=new Dog("旺财",18);Dog dog=(Dog)animal;//要强转类型dog.run();//Dog类中特有的方法System.out.println("=======");Animal animal2=new Bird("小鸟",12);Bird bird=(Bird) animal2;//要强转类型bird.fly();//Bird类中特有的方法}
}

运行代码 

21281240949c45d1bad4775eb2eb84a9.png

2.向下转型的缺点

并不是所有的向下转型都是成功的。

655dac7b18a94886b34688831f9dd55f.png

57860363b23b4fd29afafe3141b260cd.png

3.多态的使用

了解了向上转型和多态之后,我们接着来在Java中来体验多态。

代码演示

class Dog extends Animal{public Dog(String name,int age){super(name, age);}@Override  //编译器中方法重写的默认注释public void eat() {System.out.println(this.name+"在吃狗粮");}
}
class Bird extends Animal{public Bird(String name, int age) {super(name, age);}public void eat(){System.out.println(this.name+"在吃鸟粮");}
}
class Animal{public String name;public int age;public Animal(String name,int age){this.name=name;this.age=age;}public void eat(){System.out.println(this.name+"在吃饭");}
}
public class Test {public static void func(Animal animal){animal.eat();}public static void main(String[] args) {Dog dog=new Dog("旺财",18);func(dog);System.out.println("=======");Bird bird=new Bird("小鸟",12);func(bird);}
}

129db2974a1744508bc94abd0bc30893.png

1b615045c53a47a9b98a69f6bbfcd19e.png

我们都是通过animal这个引用去调用父类中的eat( )方法,但是由于eat( )对应的对象不同,就调用了各对应子类中的eat( ) 方法,最终导致了结果的不同。这就是多态在Java语言中的体现。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细分析Element中的MessageBox基本知识(附Demo)

目录 前言1. 基本知识2. Demo2.1 确认框2.2 警告框2.3 对话框 3. this.$confirm 前言 详细知识推荐阅读:详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版) MessageBox则常用于Vue2 1. 基本知识 MessageBox 是 Element UI 提供…

Liunx学习随笔

Linux学习随笔 一.前期准备1.安装Vmware Workstation软件2.下载linux镜像3.安装操作系统 夕阳无限好,只是近黄昏,时隔一年,重新提笔 没有比脚更远的路,没有比人更高的山 一.前期准备 1.安装Vmware Workstation软件 下载地址&am…

南京观海微电子----升压和降压模块电路解析

(一)升压模块 1. 如果是交流电压升压,那非常简单,只要选择变比合适的变压器就行(1:3和1:4.17); 2. 如果是直流电压升压,从12v升到36v也很容易,可选择用的开关稳压器很多,例如 :Cs5171.Cs5172.Cs5173.Cs5174.Mc33063.…

【调和级数】100321. 优质数对的总数 II

本文涉及知识点 调和级数 质数、最大公约数、菲蜀定理 LeetCode100321. 优质数对的总数 II 给你两个整数数组 nums1 和 nums2,长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以被 nums2[j] * k 整除,则称数对 (i, j) 为 优质数对&#…

数据结构·一篇搞定队列!

hello,大家好啊,肖恩又拖更了,你们听我狡辩,前段时间有期中考试,so我就没什么时间写这个,在这给大家道个歉😭😭😭 我后面一定尽力不拖更 那么接下来,我们来看…

粒子辐照环境中相机镜头防护及LabVIEW图像处理注意事项

在粒子辐照环境测试电路板性能的实验中,需要对相机镜头进行有效防护,同时利用LabVIEW进行图像识别和处理。本文将讨论相机镜头防护的关键因素和LabVIEW处理过程中的注意事项,包括防辐射材料选择、辐射屏蔽措施、散热管理、空间布局及LabVIEW软…

【机器学习-k近邻算法-01】 | Scikit-Learn工具包进阶指南:机器学习sklearn.neighbors模块之k近邻算法实战

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

骑行 - 新区永旺出发的环太湖路线

环过好几次太湖,但对路线都没太在意,都是跟着别人走的。这次自己制定一个路书,方便下次自己一个人环太湖时使用。 开始是使用高德地图做路书,只能在PC上做。我用的是网页版,每次选点太麻烦了。要输入地址搜索&#xff…

开源博客项目Blog .NET Core源码学习(27:App.Hosting项目结构分析-15)

本文学习并分析App.Hosting项目中后台管理页面的角色管理页面。   角色管理页面用于显示、检索、新建、编辑、删除角色数据同时支持按角色分配菜单权限,以便按角色控制后台管理页面的菜单访问权限。角色管理页面附带一新建及编辑页面,以支撑新建和编辑…

电缆厂可视化:提升生产透明度与运营效率

图扑电缆厂可视化系统通过实时监控和数据分析,提高生产过程的透明度和可控性,优化资源配置和质量管理,显著提升运营效率和产品质量。

电子电器架构 - AUTOSAR ON THE AIR

电子电器架构 - AUTOSAR ON THE AIR 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

Mybase长久破解

1、软件下载好之后,找到文件mybase8.ini文件 2、使用记事本打开,通过 Ctrl F 输入快速找到属性设置FirstUseOn.UserLic.App,将等号后面的数值删掉保存即可 3、使用防护中心–>自定义防护(记得开启) 4、添加规则…

Golang文件操作

文章目录 文件操作基本介绍普通的文件操作方式(os包)带缓冲的文件操作方式(bufio包)文件拷贝操作(io包) 命令行参数基本介绍解析命令行参数(flag包) JSON基本介绍JSON序列化JSON反序…

真拿AI赚到钱的人,不在朋友圈里

1 最近有张两大AI巨头对比的梗图给我看乐了,玩儿AI的还在做产品,玩儿焦虑的已经在数钱了。 这也是在做AI,只不过是唉声叹气的ai。 要我说,现在缺的根本不是AI,而是【有用的AI】。 恩格斯老师说过一句话&#xff1a…

科林Linux6_网络

#include<sys/socket.h> #include<arpa/inet.h> //大小端转换 #include<netdb.h> //DNS一、Socket套接字 为了开发网络应用&#xff0c;系统提供一套API函数接口&#xff0c;用于网络应用开发&#xff0c;这些接口称为套接字函数 struct sockaddr_in…

数据库管理-第194期 网络加速RDMA初探(20240526)

数据库管理194期 2024-05-26 数据库管理-第194期 网络加速RDMA初探&#xff08;20240526&#xff09;1 概念2 发展3 使用总结 数据库管理-第194期 网络加速RDMA初探&#xff08;20240526&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle ACE A…

不同的二叉搜索树(II)题解

toc &#x1f91a;我的博客 欢迎光临我的博客&#xff1a;https://blog.csdn.net/qq_52434217?typeblog &#x1f95b;前言 动态规划是常见的算法思路&#xff0c;动态规划在计算过程中保存了部分计算结果到内存中&#xff0c;以便于在进行下一次计算时可以直接从内存中获…

【Text2SQL】Spider 数据集

论文&#xff1a;Spider: A Large-Scale Human-Labeled Dataset for Complex and Cross-Domain Semantic Parsing and Text-to-SQL Task ⭐⭐⭐⭐⭐ EMNLP 2018, arXiv:1809.08887 Dataset: spider GitHub: github.com/taoyds/spider 一、论文速读 本文提出了 Text2SQL 方向的…

1.4 Mac 电脑 Clion 安装教程

目录 1 安装 2 激活 3 汉化 1 安装 去 https://www.jetbrains.com/clion/download/other.html 下载: 也可以直接到链接进行下载:https

嵌入式全栈开发学习笔记---C语言笔试复习大全23

目录 联合体 联合体的定义 联合体的长度 如果来判断设备的字节序&#xff1f; 如何把大端数据转换成小端数据&#xff1f; 枚举 枚举的定义 上一篇复习了结构体&#xff0c;这一节复习联合体和枚举。 说明&#xff1a;我们学过单片机的一般都是有C语言基础的了&#xff…