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

目录

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.rhkb.cn/news/74448.html

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

相关文章

容器技术:Docker搭建(通俗易懂)

目录 Docker搭建环境准备Docker安装1、查看服务器是否安装Docker2、卸载Docker3、安装Dokcer依赖环境4、配置Docker国内阿里云镜像5、安装Docker6、查看Docker信息7、配置阿里云镜像加速8、镜像安装10、运行实例11、查看实例状态12、测试 Docker命令集合 Docker搭建 环境准备 …

剑指Offer 05.替换空格

剑指Offer 05.替换空格 目录 剑指Offer 05.替换空格05.替换空格题目代码(容易想到的)利用库函数的方法题解(时间复杂度更低)面试:为什么java中String类型是不可变的 05.替换空格 题目 官网题目地址 代码(…

Ubuntu-文件和目录相关命令

🔮linux的文件系统结构 ⛳目录结构及目录路径 🧩文件系统层次结构标准FHS Filesystem Hierarchy Standard(文件系统层次结构标准) Linux是开源的软件,各Linux发行机构都可以按照自己的需求对文件系统进行裁剪,所以众多…

【零基础学Rust | 基础系列 | 数据结构】元组,数组,向量,字符串,结构体

文章标题 简介:一,元组:1,定义元组:2,访问元组元素:3,元组解构:4,元组在函数中的应用: 二,数组:1,数组的声明和…

PyTorch - GPU入门教程1

1. 安装GPU版本的PyTorch 登录PyTorch官网https://pytorch.org/,下载对应CUDA版本的PyTorch【不能直接pip install,否则安装上的是CPU版本的】 2. 查看GPU信息 (1)重要信息 !nvidia-smi我的GPU版本很垃圾,本blog仅…

UML/SysML建模工具更新(2023.7)(1-5)有国产工具

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 最近一段时间更新的工具有: 工具最新版本:Visual Paradigm 17.1 更新时间:2023年7月11日 工具简介 很用心的建模工具。支持编写用例规约。支持文本分析和C…

论文阅读-BotPercent: Estimating Twitter Bot Populations from Groups to Crowds

目录 摘要 引言 方法 数据集 BotPercent架构 实验结果 活跃用户中的Bot数量 Bot Population among Comment Sections Bot Participation in Content Moderation Votes Bot Population in Different Countries’ Politics 论文链接:https://arxiv.org/pdf/23…

基于SpringCloud+Vue的分布式架构网上商城系统设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Qt、C/C++环境中内嵌LUA脚本、实现LUA函数的调用执行

Qt、C/C环境中内嵌LUA脚本、实现LUA函数的调用执行 Chapter1. Qt、C/C环境中内嵌LUA脚本、实现LUA函数的调用执行1、LUA简介2、LUA脚本的解释器和编译器3、C环境中内嵌LUA执行LUA函数调用4、Qt内嵌LUA执行LUA函数调用5、运行结果6、内嵌LUA脚本在实际项目中的案例应用 Chapter1…

迁移学习(新人必看)

先说一下深度学习常见的问题: 1.数据集不够,通常用数据增强解决。 2.参数难以确定,训练时间长,这就需要用迁移学习来解决 什么叫迁移学习呢:比方说有一个对100w的自行车数据集,并用VGG模型训练好的网络&…

MySQL 极速安装使用与卸载

目录 mysql-5.6.51 极速安装使用与卸载 sqlyog工具 mysql简化 mysql-8.1.0下载配置 再完善 mysql-5.6.51 极速安装使用与卸载 mysql-8.1.0下载安装在后 mysql中国官网 MySQLhttps://www.mysql.com/cn/ 点击MySQL社区服务器 点击历史档案 下载完 解压 用管理员运行cmd&a…

第一百二十一天学习记录:线性代数:矩阵乘法运算(宋浩板书)

在编程和学习数据结构的过程中,发现有些算法会用到矩阵和矩阵的乘法运算,因此先将这一个知识点学习一下。 矩阵和行列式的区别 各种矩阵的概念 矩阵运算 乘法☆ 总结三条不满足

【前端|Javascript第1篇】一文搞懂Javascript的基本语法

欢迎来到JavaScript的奇妙世界!作为前端开发的基石,JavaScript为网页增色不少,赋予了静态页面活力与交互性。如果你是一名前端小白,对编程一无所知,或者只是听说过JavaScript却从未涉足过,那么你来对了地方…

【二等奖方案】Web攻击检测与分类识别赛题「爆汁大橘少糖」团队解题思路

2022 CCF BDCI 数字安全公开赛 赛题「Web攻击检测与分类识别」 地址:http://go.datafountain.cn/4Zj 爆汁大橘少糖战队获奖方案 团队简介 团队成员来自海康威视研究院,目前从事大数据算法相关的工作,具有丰富的数据挖掘实践经验。曾获得过…

【2023 华数杯全国大学生数学建模竞赛】 C题 母亲身心健康对婴儿成长的影响 Python代码实现

【2023 华数杯全国大学生数学建模竞赛】 C题 母亲身心健康对婴儿成长的影响 1 题目 母亲是婴儿生命中最重要的人之一,她不仅为婴儿提供营养物质和身体保护, 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况,如抑郁、焦虑、压力等…

MySQL操作命令详解:增删改查

文章目录 一、CRUD1.1 数据库操作1.2 表操作1.2.1 五大约束1.2.2 创建表1.2.3 修改表1.2.3 删除表1.2.4 表数据的增删改查1.2.5 去重方式 二、高级查询2.1 基础查询2.2 条件查询2.3 范围查询2.4 判空查询2.5 模糊查询2.6 分页查询2.7 查询后排序2.8 聚合查询2.9 分组查询2.10 联…

C高级DAY2

1.思维导图 2. 递归实现,输入一个数,输出这个数的每一位 递归实现,输入一个数,输出这个数的二进制c 写一个脚本,包含以下内容: 显示/etc/group文件中第五行的内容创建目录/home/ubuntu/copy切换工作路径到…

MySQL(一)基本架构、SQL语句操作、试图

MySQL系列文章 MySQL(一)基本架构、SQL语句操作、试图 MySQL(二)索引原理以及优化 MySQL(三)SQL优化、Buffer pool、Change buffer MySQL(四)事务原理及分析 MySQL(五&a…

性能优化-react路由懒加载和组件懒加载

背景 随着项目越来越大,打包后的包体积也越来越大,严重影响了首屏加载速度,需要对路由和组件做懒加载处理 主要用到了react中的lazy和Suspense。 废话不多说,直接上干货 路由懒加载 核心代码 import React, { lazy, Suspens…

MySQL数据库——多表操作

文章目录 前言多表关系一对一关系一对多/多对一关系多对多关系 外键约束创建外键约束插入数据删除带有外键约束的表的数据删除外键约束 多表联合查询数据准备交叉连接查询内连接查询外连接查询左外连接查询右外连接查询满外连接查询 子查询子查询关键字ALL 关键字ANY 和 SOME 关…