面向对象程序三大特性一:多态(超详细)

目录

1.重写

1.1基本语法规则

1.2规则深化

1.3重写与重载的区别

2.向上转型

2.1简单介绍

2.3向上转型的作用

3.向下转型

3.1介绍

3.2instanceof 基本介绍

4.多态

4.1多态实现条件

4.2避免在构造方法中调用重写的方法


1.重写

重写 (override) :也称为覆盖。重写是子类对父类非静态、非 private 修饰,非 final 修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变 即外壳不变,核心重写。

1.1基本语法规则

1) 返回值类型 (2)方法名 (3)参数列表 要完全一致
例子:

将eat()方法在子类中进行重写 

1.2规则深化

(1) 被重写的方法返回值类型可以不同 但是必须是具有父子关系的
(2) 访问权限不能比父类中被重写的方法的访问权限更低 。例如:如果父类方法被 public 修饰,则子类中重写该方 法就不能声明为 protected
(3) 父类被static、final和private修饰的方法、构造方法都不能被重写。

1.3重写与重载的区别

 重写和重载就体现多态

静态绑定:也称为前期绑定(早绑定)即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代 表函数重载。

动态绑定 :也称为后期绑定 ( 晚绑定 ) 即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体 调用那个类的方法。
动态绑定的图解:(图1-1)
 

                                                             (图1-1) 


2.向上转型

2.1简单介绍

向上转型:

实际就是创建一个子类对象,将其当成父类对象来使用

语法格式:
父类类型 对象名 = new 子类类型()

具体代码在代码(2-1) 

向上转型的形式

(1)直接赋值

Animal animal = new Cat("元宝",2);

(2)方法传参

就是传参时进行 向上转型

(3)方法返回

同理:就是返回时进行 向上转型

2.3向上转型的作用

 

我们按向上转型的语法写完代码具体能做些什么?

(1)调用父类特有的方法 

(2)仅调用被子类重写的方法

看代码(2-1)
public class Animal {String name;int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void eat(){System.out.println(name+"吃点啥");}public void Father(){System.out.println("我是父类");}
}
public class Dog extends Animal{public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(name+"吃狗粮");}public void cry(){System.out.println("狗叫");}
}
public class Cat extends Animal{public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println(name+"吃猫粮");}public void cry(){System.out.println("猫叫");}
}
public class Text {public static void fun(Animal a){a.eat();}public static void main(String[] args) {Animal animal1=new Dog("圆圆",19);Animal animal2=new Cat("方方",17);animal1.Father();fun(animal1);fun(animal2);}
}

运行结果:

(1)调用父类特有的方法 

 

无法调用子类特有方法

 

 (2)仅调用被子类重写的方法

 

问:如果想调用子类特有方法,怎么办?

3.向下转型

3.1介绍

将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的 方法,此时:将父类引用再还原为子类对象即可,即向下转换。
Animal,Dog的代码请看代码(2-1)
class Text2{public static void main(String[] args) {Animal a1=new Dog("haha",8);if(a1 instanceof Dog){Dog dog=(Dog) a1;dog.cry();}}
}

运行结果:

3.2instanceof 基本介绍

语法为:

引用类型变量(object) instanceof 类(class)

 功能:

判断前面的对象是否属于后面的类,或者属于其子类;
如果是,返回 true,不是返回 false

instanceof 前面的引用变量编译时的类型要么与后面的类型相同,要么与后面的类型具有父子继承关系


 

4.多态

4.1多态实现条件

1. 必须在继承体系下
2 . 子类必须要对父类中方法进行重写
3 . 通过父类的引用调用重写的方法
缺一不可(上面 代码(2-1) 其实已经使用了 多态
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法
我们再看一个新例子
例子:
public class Shape {public void draw(){System.out.println("图形");}}
class Rect extends Shape{@Overridepublic void draw() {System.out.println("矩形");}
}class Cycle extends Shape{@Overridepublic void draw() {System.out.println("圆");}
}class Flower extends Shape{@Overridepublic void draw() {System.out.println("花");}
}
class Text2{public static void main(String[] args) {Shape shape[]={new Cycle(),new Rect(),new Flower()};for(Shape shape1:shape){shape1.draw();}}
}

运行结果:

多态缺陷:
1. 属性没有多态性
当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性
2. 构造方法没有多态性

4.2避免在构造方法中调用重写的方法

我们创建两个类 , B 是父类 , D 是子类 . D 中重写 func 方法 . 并且在 B 的构造方法中调用 func
class B {
public B() {
// do nothing
func();
}
public void func() {
System.out.println("B.func()");
}
}
class D extends B {
private int num = 1;
@Override
public void func() {
System.out.println("D.func() " + num);
}
}
public class Test {
public static void main(String[] args) {
D d = new D();
}
}
执行结果
D . func ()  0
解释:
(1) 构造 D 对象的同时 , 会调用 B 的构造方法
(2)B 的构造方法中调用了 func 方法 , 此时会触发动态绑定 , 会调用到 D 中的 func
(3) 此时 D 对象自身还没有构造 , 此时 num 处在未初始化的状态 , 值为 0
结论 : " 用尽量简单的方式使对象进入可工作状态 ", 尽量不要在构造器中调用方法 ( 如果这个方法被子类重写 , 就会触 发动态绑定, 但是此时子类对象还没构造完成 ), 可能会出现一些隐藏的但是又极难发现的问题

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

 

 

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

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

相关文章

vscode 快捷键

今天好闲 就记一些学的东西吧~ vscode 快捷键 快速生成头文件注释:Ctrlalti 快速生成方法注释:Ctrlaltt 新建窗口:CtrlShiftn 查找:Ctrlf 替换:Ctrlh 替换所有:CtrlAltEnter 打开上一个编辑器:…

【漏洞挖掘】Xray+rad自动化批量漏洞挖掘

文章目录 前言一、挖掘方法二、使用步骤工具安装使用方法开始挖掘 总结 前言 自动化漏洞挖掘是指利用计算机程序和工具来扫描、分析和检测应用程序、网络和系统中的安全漏洞的过程。这种方法可以帮助安全专家和研究人员更高效地发现和修复潜在的安全威胁,从而提高整…

Docker-Compose编排与部署

目录 Docker Compose Compose的优点 编排和部署 Compose原理 Compose应用案例 安装docker-ce 阿里云镜像加速器 安装docker-compose docker-compose用法 Yaml简介 验证LNMP环境 Docker Compose Docker Compose 的前身是 Fig,它是一个定义及运行多个 Dock…

异或运算详解

异或运算详解 定义特性用途总结 定义 参与运算的两个数据,按二进制位进行 ^ 运算,如果两个相对应为值相同结果为0,否则为1 1 ^ 0 1 0 ^ 1 1 0 ^ 0 0 1 ^ 1 0特性 异或^运算只能用于数值(整数) x ^ 0 x x ^ x 0用途 两个值交换,而不用使用临时变量 a a ^ b; b b ^…

负数的二进制转换成十进制

对于一个k位的二进制正数,其表示成十进制的结果是: pos[i]表示:这个正数的二进制形式的第i位是1。 i从最低位(第0位)开始,一直到k-1位。有符号数中,正数的第k-1为0,负数的第k-1位为…

el-popover全屏不显示(bug记录)

我做了一个el-table全屏展示的功能, 然后里面的el-popover在全屏后无法展示, 刚开始以为是写唯一的key或者ref, 发现写了也不行, 后来以为要写’:append-to-body“false”, 最后发现是我的外层的层级写得太高了; position: fixed; z-index: 9999; <div class"box"…

HTML模板生成word,pdf文档

1.获取html模板 public static void main(String[] args) {String htmlContent getHtmlFileContent(templateName,dataMap);String exportType "pdf";if (exportType.equals("pdf")){convertToPdf(htmlContent,filePath);}else {exportWord(htmlContent…

SequenceDiagram 查看代码时序图的利器,做技术方案必备!

前言 “ 无论是快速了解业务流程&#xff0c;还是快速的熟悉系统的业务代码逻辑&#xff0c;以及各个类和方法等的调用关系&#xff0c;时序图无疑是其中一种不可获取的简便快捷的方式。一起来了解下&#xff0c;IDEA如何快速生成时序图吧。” 工作中&#xff0c;经常需要绘制…

22 年 408 新大纲操作系统新增考点

22 年 408 新大纲操作系统新增考点 一、操作系统引导 操作系统引导指的是将操作系统内核装入内存并启动系统的过程&#xff0c;系统引导通常是由一段被称为启动 引导程序的特殊代码完成的&#xff0c;它位于系统 ROM 中&#xff0c;用来完成定位内核代码在外存的具体位…

【动态规划算法】-回文串问题题型(34-40题)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

2.3转移线程的所有权

转移线程的所有权 假设你想要编写一个函数&#xff0c;它创建一个在后台运行的线程&#xff0c;但是向调用函数回传新线程的所有权&#xff0c;而非等待其完成&#xff0c;又或者你想要反过来做&#xff0c;创建一个线程&#xff0c;并将所有权传递给要等待它完成的函数。在任…

一个 git 仓库下拥有多个项目的 git hooks 配置方案

前言 通常情况下&#xff0c;一个 git 仓库就是一个项目&#xff0c;只需要配置一套 git hooks 脚本就可以执行各种校验任务。对于 monorepo 项目也是如此&#xff0c;monorepo 项目下的多个 packages 之间&#xff0c;它们是有关联的&#xff0c;可以互相引用&#xff0c;所以…

CRM系统如何进行公海池线索分配自动化?

在销售过程中&#xff0c;线索分配是一个非常重要的环节。传统的线索分配方式往往是由销售主管手动进行&#xff0c;不仅效率低下&#xff0c;还存在着不公平、不灵活的问题。因此&#xff0c;许多企业通过CRM来实现公海池线索分配自动化。 1、基于规则的分配 CRM可以让用户设…

C语言易错知识点总结2

函数 第 1 题&#xff08;单选题&#xff09; 题目名称&#xff1a; 能把函数处理结果的二个数据返回给主调函数&#xff0c;在下面的方法中不正确的是&#xff1a;&#xff08; &#xff09; 题目内容&#xff1a; A .return 这二个数 B .形参用数组 C .形参用二个指针 D .用…

express学习笔记6 - 用户模块

新建router/user.js const express require(express) const routerexpress.Router() router.get(/login, function(req, res, next) {console.log(/user/login, req.body)res.json({code: 0,msg: 登录成功})})module.exportsrouter 在router/user.js引入并使用 const us…

Vue进阶(幺叁陆): transition标签实现页面跳转动画

文章目录 一、前言二、方案实现三、延伸阅读 transition标签四、拓展阅读 一、前言 在Vue项目开发过程中&#xff0c;应用全家桶vue-router实现路由跳转&#xff0c;且页面前进、后退跳转过程中&#xff0c;分别对应不同的切换动画。vue-router 切换页面时怎么设置过渡动画&am…

ansible-kubeadm在线安装单masterk8s v1.19-v1.20版本

ansible可以安装的KS8版本如下&#xff1a; 请按照此博客中的内容操作后&#xff0c;才可以通过下面的命令查询到版本。 [rootk8s-master01 ~]# yum list kubectl --showduplicates | sort -r kubectl.x86_64 1.20.0-0 kubern…

MySQL日志——错误日志、二进制日志

错误日志二进制日志查询日志慢查询日志 1.错误日志 查看日志位置&#xff1a; show variables like %log_error%查看错误日志&#xff1a; tail -f /var/log/mysql.log2.二进制日志 show variables like %log_bin%;cd /var/lib/mysql ll2.1 日志格式 查看日志格式指令&…

计算机视觉与图形学-神经渲染专题-ConsistentNeRF

摘要 Neural Radiance Fields (NeRF) 已通过密集视图图像展示了卓越的 3D 重建能力。然而&#xff0c;在稀疏视图设置下&#xff0c;其性能显着恶化。我们观察到&#xff0c;在这种情况下&#xff0c;学习不同视图之间像素的 3D 一致性对于提高重建质量至关重要。在本文中&…

Nvidia Triton 使用入门教程

1 相关预备知识 模型&#xff1a;包含了大量参数的一个网络&#xff08;参数结构&#xff09;&#xff0c;体积10MB-10GB不等。模型格式&#xff1a;相同的模型可以有不同的存储格式&#xff08;可类比音视频文件&#xff09;&#xff0c;目前主流有torch、tf、onnx和trt&…