一文讲解——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,一经查实,立即删除!

相关文章

springboot中线程池的使用

一、概念 线程池就是将多个线程对象放入一个池子里面,例如一个池塘,线程池就是这个池塘,池塘里面的鱼就是线程池中的多个线程对象。1. 每一个线程,在一段时间内只能执行一个任务。2. 线程池中的各个线程是可以重复使用的。 二、创…

2024年内外贸一体化融合发展(长沙)交易会 ​办公文具、礼品工艺品展

2024年内外贸一体化融合发展(长沙)交易会 办公文具、礼品工艺品展 时间:2024年7月12-14日 地点:湖南国际会展中心(芒果馆) 湖南省商厅 关于邀请参加2024内外贸一体化融合发展(长沙&#xf…

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

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

簡述vue的實現原理

Vue.js 的实现原理可以概括为以下几个方面: 响应式系统: Vue 的核心是其响应式系统。当 Vue 实例被创建时,它会遍历 data 对象中的所有属性,并使用 Object.defineProperty 方法将其转换为 getter 和 setter。当 data 中的属性发生…

python:如何创建简单的流媒体服务器来播放.flv文件

要在Python中创建一个简单的流媒体服务器来播放FLV(Flash Video)文件,你通常需要一个HTTP服务器,该服务器能够处理对FLV文件的范围请求(Range Requests),因为流媒体通常不是一次性下载整个文件&…

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.…

正则工具类

目录 1、 * 正则工具类 1.1、 * 提供验证邮箱、手机号、电话号码、身份证号码、数字等方法 1.1.1、 * 验证固定电话号码 1.1.2、 * 验证整数(正整数和负整数) 1.1.3、 * 验证整数和浮点数(正负整数和正负浮点数)

贪心算法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的输入和和输出包括以下三个方面: 对系统指定的标准设备的输入和输出,即从键盘输入数据,输出到显示器屏幕。以外存磁盘(或光盘、…

初探 Spring Boot Starter Security:构建更安全的Spring Boot应用

引言 Spring Boot 作为 Java 生态系统下的热门框架,以其简洁和易上手著称。而在构建 Web 应用程序时,安全性始终是开发者必须重视的一个方面。Spring Boot Starter Security 为开发者提供了一个简单但功能强大的安全框架,使得实现身份验证和…

从动态代理角度简单理解Spring AOP

1. 概述 动态代理 是指在运行时,动态地创建目标类的代理对象,并对其中特定的方法进行拦截或增强的技术。这种技术主要用于在不修改目标类代码的情况下,增强目标类的功能。 在Java中,动态代理主要基于Java的反射机制和接口来实现…

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

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

DDL—表—数据类型—字符串类型相关语法

(1)表格可视化 普通字符串 类型大小描述CHAR0~255 bytes定长字符串,其表示即使你存储一个字符,它也会占用你括号里个数的字符的空间,因为未占用的字符的其它空间会用空格进行补位。需要再后面跟一个参数:…

harmony 鸿蒙ArkUI动画/交互事件开发常见问题(ArkTS)

ArkUI动画/交互事件开发常见问题(ArkTS) 焦点事件onBlur/onFocus回调无法触发(API 9) 问题现象 焦点事件onBlur/onFocus回调无法触发 解决措施 焦点事件默认情况下需要外接键盘的Tab键,或方向键触发,点击触发焦点事件需要添加焦点控制属性focusOnTo…

Linux 监控USB硬盘插拔事件并自动挂载和卸载

定义udev规则来监控USB插拔事件。 一、在/etc/udev/rules.d目录下随意创建一个规则文件,例:99-usb-mount.rules KERNEL"sd[b-z]?",SUBSYSTEM"block",RUN"/usr/local/src/mountusb.sh %k $env{ACTION}"二、创建 /usr/lo…