一文讲解——Java多态

目录

  • 一、什么是多态?
  • 二、转型
    • 向上转型
    • 向下转型
  • 三、方法覆盖与方法重载
  • 四、绑定
    • 动态绑定
    • 静态绑定
  • 五、理解多态

在这里插入图片描述

一、什么是多态?

多态的词组字面意思是: 某种事物多种形态。
但是对于我们学习Java 的程序原来说,就不不能简单这样来理解了。
多态是 完成某个行为,不同的对象去实现会有不同的效果。现在还看不懂其实没关系,也就简单提一嘴。

举个栗子:
在这里插入图片描述

有一天,学校二食堂做了一大盘深海大闸蟹,你和小帅同时在排队。此时一位长得very beautiful 的女生——小美来了,到窗口看了一下菜,感觉不错,也想吃。但是排队的人太多了,就想插下队。你一看,我丢想插队,门都没有,表现出不肯的样子。而你后面的小帅眼睛一亮,就说,小美同学你好,我看你插队的话影响不好,不如我多打一份给你,倒时候加个微信发我就行了。此时这就是多态,不同的人对一件事表现出不同的状态。到头来‘你’还在为什么,自己还单身着。小帅到后面,小美微信也加了,说:就一顿饭钱也没多少,算了算了。此时小美就非常感动,说:小帅同学下次我会请你吃一顿。这样一来而去。。。

磨刀不误砍柴功,要想学真正学会多态就要理解一下,向上转型是怎么转的?静态绑定是怎么绑定的,方法的覆盖是?最后,学完才可以说学会了Java 的多态,太哇塞了!!!

二、转型

向上转型

向上转型: 父类 引用 子类型对象
也好理解 儿子孝顺父亲,给父亲买点礼物,父亲乐意地接受了。

例子:创建一个父类 Animal 其子类有Dog, Cat
测试类 Test

public class Animal {public String name;//无参构造方法public Animal() {}//有参构造方法public Animal(String name) {this.name = name;}//动物会说方法public void speak() {System.out.println("会说话-----------");}}
public class Cat extends Animal{//无参构造方法public Cat() {}//有参构造方法public Cat(String name) {super(name);//子类继承父类,就要先对父类进行初始化}public void speak() {System.out.println(this.name+"会喵喵叫-----");}}
public class Dog extends Animal{//无参构造方法public Dog() {}//有参构造方法public Dog(String name) {super(name); //子类继承父类,就要先对父类进行初始化}public void speak() {System.out.println(this.name+"会汪汪叫------");}//dog 特有的方法public void lookHouse() {System.out.println(this.name+"会看家-----------");}}
public class Test {public static void main(String[] args) {Animal dog = new Dog("小黑");dog.speak();Animal cat = new Cat("小咪");cat.speak();}
}

有三种表示方式
1.直接赋值
在这里插入图片描述

2.方法传参
在这里插入图片描述

3.返回值
在这里插入图片描述

总结
优点 父类可以接受任何的子类

又创建了一个Cat 类 ,也是可以接受的
在这里插入图片描述
缺点 不能调用子类特有方法,因为你还是Animal 类!在这里插入图片描述

向下转型

父类强转子类

Animal 转为 Dog子类
a instanceof b : 判断 a 是否为b类型 。是返回 true ,否返回false


public class Test {public static void main(String[] args) {Animal animal = new Dog("小黑");if(animal instanceof Dog) { Dog dog = (Dog)animal;//可以 调用子类特有的方法dog.lookHouse();}}
}

注意了 强转是要注意 子类一致
一开始是狗,怎么强转成猫呢?
就像养一只小狗,再怎么养,也不会变成小猫。因为一生下来就决定了的。


public class Test {public static void main(String[] args) {Animal animal = new Dog("小黑");Cat cat = (Cat) animal; //errorcat.speak(); //error}
}

在这里插入图片描述

总结:在这里插入图片描述

三、方法覆盖与方法重载

方法重载: 我想大家都应该知道:就是在同一个类中,方法名相同,参数列表不同。就只要记住一个方法名,就可以调用不同的参数列表,提高了效率。

以add() 加法为例子:

public class Test {public static void main(String[] args) {System.out.println("方法重载");//相同 add方法名,不同参数列表。构成方法重载System.out.println(add(1,5));System.out.println(add(1,2,3));}public static int add(int a,int b) {return a+b;}public static int add(int a,int b,int c) {return a+b+c;}
}

方法覆盖: 也叫方法重写。发生在父子类之间的关系,方法名相同,参数列表相同,返回值也要相同。
也好理解,重写是重新再写一遍呗,不改变原来的
父类的方法完成不了子类的需求,就要重写
在这里插入图片描述
方法覆盖也存在一些细节
1.static ,final ,private 修饰的方法,构造方法 不能被重写。
2.子类重写的方法,访问权限要 >= 父类 原来的方法。
3.重写方法的返回值类型也可不同,但是要构成父子类关系
在这里插入图片描述

四、绑定

动态绑定

动态绑定是理解多态的基础。
那什么是动态绑定呢?
程序在编译的时候,确实是调用了父类的方法。但在运行的时候,通过父类的引用,调用的却是子类重写父类的那个方法。这就叫动态绑定。

还是以之前的Animal ,Dog 为例子:
不是输出: 会说话-------在这里插入图片描述

静态绑定

“静态绑定"也称为"早期绑定”。
简单 就相当于平时调用方法 。就是调用这个方法时,编译器确定调用这个方法。

public class Test {public static void main(String[] args) {Test test = new Test();test.func(); //确定调用func()}public  void func() {System.out.println("我就是一个普通的方法------");}
}

五、理解多态

现在,我们学习了
向上转型 就是父类型 引用 子类型对象 ,方法的重写是 父类的方法完成不了子类的需求,就要重写。 静态绑定:运行是调用子类重写父类的方法。

请看

public class Test {public static void main(String[] args) {Animal dog = new Dog("小黑");Animal cat = new Cat("小花");autoSpeak(dog);autoSpeak(cat);}public static void autoSpeak(Animal animal) {animal.speak();}
}

在这里插入图片描述
在这里插入图片描述

autoSpeak() 方法就会自动的调用 子类的speak()方法。
不要判断 是否为 Dog 类 还是 Cat 类。
1.能够降低代码的 “圈复杂度”, 避免使用大量的 if - else
2.可扩展能力强

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

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

相关文章

Weblogic XML反序列化漏洞 [CVE-2017-10271]

漏洞环境搭建请参考 http://t.csdnimg.cn/i11e2 漏洞原理 Weblogic的wls security组件对外提供webservice服务,wls security组件使用了xmldecoder来解析用户传入的xml数据,如果用户进行xml恶意数据的构造,即可触发反序列化漏洞 漏洞版本 O…

CentOS 7.9 邮箱部署——Postfix+Dovecot详细

PostfixDovecot 文章目录 PostfixDovecot资源列表基础环境一、部署DNS二、部署postfix和dovecot2.1、配置postfix2.2、配置dovecot2.3、创建邮件用户 三、发送邮件测试3.1、windows安装poxmail3.2、登录邮箱3.3、发送接收邮件 四、搭建SSL认证加密4.1、生成私钥4.2、生成公钥4.…

贪心算法4(c++)

过河的最短时间 题目描述 输入 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过,如果…

YOLOv8_pose预测流程-原理解析[关键点检测理论篇]

YOLOv8_seg的网络结构图在博客YOLOv8网络结构介绍_CSDN博客已经更新了,由网络结构图可以看到相对于目标检测网络,实例分割网络只是在Head层不相同,如下图所示,在每个特征层中增加了KeyPoint分支(浅绿色),通过两个卷积组和一个Conv卷积得到得到通道数为51的特征图,51表示…

window环境下QT5开发环境的搭建

1、安装visual Stusio 15 生成工具2012 2、安装Visual studio Enterprise 2017 3、Visual studio Enterprise 2017安装完成之后, 修改:选择桌面调试,如下: 4、打开QTcreator,选项中,配置编译器&#xff…

摸鱼大数据——Hive基础理论知识——Hive环境准备

Hive环境准备 1、shell脚本执行方式 方式1: sh 脚本 注意: 需要进入脚本所在目录,但脚本有没有执行权限不影响执行 方式2: ./脚本 注意: 需要进入脚本所在目录,且脚本必须有执行权限 方式3: /绝对路径/脚本 注意: 不需要进入脚本所在目录,但必须有执行…

线程池,日志

所要用到的知识点: 多线程的创建 生产消费模型, 线程锁 条件变量 代码: 线程池日志

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与单片机连接的按键的按键值的功能

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与单片机连接的按键的按键值应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍TM1638键盘数码…

C++面向对象程序设计 - 输入和输出

程序的输入指的是文件将数据传送给程序,程序的输出指的是从程序将数据传送输出文件。 C的输入和和输出包括以下三个方面: 对系统指定的标准设备的输入和输出,即从键盘输入数据,输出到显示器屏幕。以外存磁盘(或光盘、…

gdc2024:Raytracing in Snowdrop技术实现与性能优化策略

在今年的GDC(游戏开发者大会)的Advanced Graphics Summit上,关于Snowdrop引擎中光线追踪技术的讨论引起了广泛关注。 一、光线追踪全局照明的实现细节 屏幕空间追踪: 屏幕空间追踪从相机出发,对屏幕上的每个像素点生成…

C++ 红黑树

目录 1.红黑树的概念 2.红黑树的性质 3.红黑树节点的定义 4.红黑树的插入操作 5.数据测试 1.红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个…

C++基础与深度解析 | 泛型算法 | bind | Lambda表达式

文章目录 一、泛型算法1.泛型算法的分类2.迭代器分类 二、bind与lambda表达式1.bind2.lambda表达式 三、泛型算法的改进--ranges(c20) 一、泛型算法 C中的泛型算法是标准模板库(STL)的一部分(这里重点讨论 C 标准库中定义的算法,而…

【vue-cli搭建vue项目的过程2.x】

vue-cli搭建vue项目 vue-cli搭建vue项目安装node安装vue-cli脚手架并创建项目安装 Ant Design Vue或element-ui(笔者使用Ant-design-vue组件,并全局引入)开发安装三方库包1、Package.json文件---引入如下package.json文件执行npm i或npm install命令即可下载如下依赖…

数据结构~~链式二叉树

目录 一、基本概念 链式存储概念 二、链式二叉树的结构 链式二叉树结构 构建链式二叉树 二叉树的遍历 二叉树节点和高度等 二叉树销毁 三、链式二叉树的练习 相同的树 对称二叉树 另外一颗子树 二叉树前序遍历 二叉树遍历 四、完整代码 Tree.h Tree.c 五、总结 一…

Linux服务升级:Predixy 升级代理 Redis-cluster 集群

目录 一、实验 1.环境 2. 启动Redis服务 3.Predixy 升级代理 Redis-cluster 集群 二、问题 1. Predixy进行set操作报错 2.如何创建脚本启动predixy 3.Redis代理对比 一、实验 1.环境 (1)主机 表1 主机 系统版本节点软件IP备注CentOS7.9Redis…

Springboot开发 -- Postman 调试类型详解

引言 在 Spring Boot 应用开发过程中,接口测试是必不可少的一环。Postman 作为一款强大的 API 开发和测试工具,可以帮助开发者轻松构建、测试和管理 HTTP 请求。本文将为大家介绍如何在 Spring Boot 开发中使用 Postman 进行接口测试。 一、准备工作 安…

C/C++|malloc分配内存详解

看本节前,希望读者有linux内存分布的基本概念,可以阅读这篇文章: 进程虚拟地址空间和函数调用栈 在本节中希望读者可以一口气阅读完所有内容。 本博客内容全部来自小林coding:malloc 是如何分配内存的? 这里仅为笔记记…

Linux/Ubuntu 中安装 ZeroTier,实现内网穿透,2分钟搞定

相信很多人都有远程连接家中设备的需求,如远程连接家中的NAS、Windows等服务,所以会涉及到一个内网穿透工具的使用,如果没有公网IP的情况下,推荐大家使用ZeroTier,这是一款强大的内网穿透工具。 mac和windows版的操作…

Nginx-狂神说

Nginx概述 公司产品出现瓶颈? 我们公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。 但是慢慢的,使用我们平台…

K8S认证|CKA题库+答案| 13. sidecar 代理容器日志

目录 13、使用 sidecar 代理容器日志 CKA v1.29.0模拟系统免费下载试用: 题目: 开始操作: 1)、切换集群 2)、生成yaml文件 3)、官网找模板 4)、编辑yaml文件 5)、应用yaml…