【JavaSE】面向对象三大特性之多态

news2025/4/7 3:54:05

文章目录

  • 多态的概念
  • 向上转型
  • 重写之动态绑定与重载之静态绑定
    • 重写与重载的区别
    • 重写的注意事项总结
  • 不安全的向下转型
  • 多态的优点和注意事项
    • 优点
    • 缺点和注意事项

多态的概念

多态可以理解为一个对象在某些时刻可以代表不同的对象,指的是对象的多种形态。所以在某些时刻,通过这个对象去实现行为时,会出现不同的状态。

向上转型

多态要发生,那么就要满足三种情况:

1、有继承关系
2、向上转型
3、子类必须对父类中方法进行重写,通过父类引用调用重写方法

下面我们先来看看向上转型
在这里插入图片描述
理论上我们在创建变量时,两边的数据类型要相同 ,但是我们来看看我们这个代码 Animal animal = new Cat();此时我们两边的数据类型并不相同,前面是父类Animal类后面new了一个Cat类,因为猫是动物的,把子类对象Cat转化为Animal是合理的,我们称为向上转型。那么此时使用animal去访问Animal Cat的成员方法的时候会发生那什么呢?

class Animal {
    public String name;
    public int age;

    public Animal() {

    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat() {
        System.out.println(name + "吃饭");
    }
}

class Cat extends Animal {

    public Cat() {
        super();
    }

    public Cat(String name, int age) {
        super(name, age);
    }
    
    public void miaomiao() {
        System.out.println("喵喵");
    }

    @Override
    public void eat() {
        System.out.println(name + "吃猫粮");
    }
}


在这里插入图片描述
当我们使用向上转型去访问子类特有的方法时会报错,所以我们说当发生了向上转型后,父类的引用只能访问自己的成员,不可以访问到子类特有的成员

重写之动态绑定与重载之静态绑定

我们讲了要发生多态的三种条件的两条了,现在就剩下子类必须对父类中方法进行重写,通过父类引用调用重写方法这个条件了,这个条件该怎么理解呢?什么是重写呢?下面我们就来讲讲:
重写顾名思义,就是将父类中的方法在子类中重新写一边,方法的参数、返回值、方法名都不变,将方法内部的方法实现进行重新编写。那重写有什么意义呢?让我们举个例子:还是猫猫类和动物类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时我们通过向上转型了创建了一个对象,通过这个对象去访问这个eat方法,会发生什么事呢?
在这里插入图片描述
我们发现跟我们所想的不一样,难道animal.eat();不应该是调用父类的eat();方法嘛?我们通过看看底层的代码逻辑:
在这里插入图片描述
编译时调用父类方法,而在运行时有变为子类的eat();方法了,我们称这样的过程为动态绑定,这也是多态的体现,假如现在又有一个狗狗类,狗狗类继承动物类,也重写了eat();方法我们向上转型创建一个狗狗对象,调用eat();方法,这时我们又会运行狗狗类的eat();方法,这样就解释了多态的概念在某些时刻,通过这个对象去实现行为时,会出现不同的状态

重写与重载的区别

有动态绑定那么有没有静态绑定呢?当然是有的,在之前我们提到过重载概念,他在我们编译的时候就已经知道该调用什么方法了,我们称这样的方式为静态绑定。那么重写与重载有什么区别呢?

区别点重写重载
参数列表一定不能修改必须修改
返回类型一定不能修改(除非可以构成父子类关系)可以修改
访问限定付费一定不能做更严格的限制可以修改

重写的注意事项总结

重写时有一些值得我们注意的地方:

1、父类中static private final修饰的方法,都不可以被重写
2、子类重写父类方法时,必须与父类方法一致,方法名、返回值类型、参数
3、访问权限不能比父类中被重写的方法的访问权限低。例如父类中方法被public修饰重写时就不能用protected

不安全的向下转型

如果大家可以理解向上转型,那么大家也一定可以理解向下转型:
在这里插入图片描述
为什么说向下转型是不安全的呢?因为向上转型:猫猫类属于动物类,向上转型符合逻辑,但是动物类都是猫猫类嘛?不是吧,所以会出现问题,我们在代码中看一看:

class Animal {
    public String name;
    public int age;

    public Animal() {

    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat() {
        System.out.println(name + "吃饭");
    }
}



class Cat extends Animal {

    public Cat() {
        super();
    }

    public Cat(String name, int age) {
        super(name, age);
    }


    @Override
    public void eat() {
        System.out.println(name + "吃猫粮");
    }
}



class Dog extends Animal {

    public Dog() {
        super();
    }

    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(name + "吃狗粮");
    }
}

在这里插入图片描述
在这里插入图片描述
编译之后我们发现报错了,抛出了一个异常,这种情况我们可以使用instanceof进行判断:
在这里插入图片描述
在这里插入图片描述
这样就好了,以上就是向上转型的不安全型,在实际的开发中我们也很少会用到。

多态的优点和注意事项

优点

多态可以降低代码的圈复杂度,圈复杂度简单粗暴的理解为一段代码中if else出现的次数。我们来看这样一段代码:
在这里插入图片描述
我们希望打印多个形状,我们就可以创建一个父类Shape数组,里面的元素为子类对象,这时会发生向上转型,我们遍历数组,调用draw方法就可以打印对应的图形,如果我们没有多态,那么我们还需要使用if else进行判断,再去调用对应的对象的方法,十分麻烦。而且如果我们希望增加一个新的形状,也十分简单,只需要增加一个子类就可以了。

缺点和注意事项

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

要避免在构造方法中调用重写的方法
在这里插入图片描述zqa

所以:用尽量简单的方式使对象进入工作状态,尽量不要在构造器中调用方法,可能会出现一些隐藏的但又极难发现的问题

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

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

相关文章

CSDN第九次竞赛题解与总结

CSDN第九次竞赛题解与总结前言T1小艺读书题意分析T2鬼画符门之宗门大比题意分析代码别的方法T3硬币划分题意分析状态转移方程初始值代码T4饿龙咆哮-逃离城堡题意分析坑点代码写在最后前言 2022/11/12 我有幸参加了csdn第九次竞赛,终于拿了次满分,进了次…

Vuex④(多组件共享数据、Vuex模块化+namespace)

文章目录多组件共享数据代码实现Vuex模块化总结多组件共享数据 我们现在想实现这种情况: Person组件的总人数就是Person中列表的长度 br上的是Count组件,br下的是Person组件。 我们通过vuex中的state实现一些数据的多组件共享: 代码实现 …

第二章STP应用配置

目录 一 生成树 二 生成树算法 三 STP是什么 四 BPDU是什么 五 BPDU的概念 六 生成树基本配置 一 生成树 生成树算法的网桥协议STP(Spanning Tree Protocol) 它通过生成生成树保证一个已知的网桥在网络拓扑中沿一个环动态工作。网桥与其他网桥交换BPDU消息来监测环路&#xf…

使用 hugo oss 搭建个人博客网站

系列文章目录 文章目录系列文章目录前言一、下载hugo二、oss三、域名四、创建博客上传五、发布,上传文章前言 本文主要详解如何用最低的成本搭建个人博客网站 原本我是直接用的github搭建的博客网站,因为免费,但由于github访问很不稳定&…

Python——正则表达式的应用

文章目录前言正则表达式方法re.search方法group方法re.match方法re.findall方法re.finditer方法re.split方法re.sub方法正则表达式的应用前言 提示:这里可以添加本文要记录的大概内容: 正则表达式是字符串处理的有力工具和技术。 使用正在表达式的目的…

多态(polymorphic)

目录 1. 多态的基本介绍 2. 多态实现条件 3. 重写 重写的介绍: 【重写和重载的区别】 动、静态绑定机制 5 向上转型和向下转型 向上转型 向上转型的特点(总结): 向下转型 多态的优缺点 多态是Java三大基本特征中最抽象…

【数据结构初阶】数组栈和链式队列的实现

努力真的要贯穿人的一生吗? 你能活成你想要的样子吗? 真的不知道! 文章目录一、栈的概念及结构二、栈的实现(动态数组栈)2.1 挑选实现栈的结构2.2 栈结构的定义2.3 初始化栈销毁栈2.4 入栈出栈2.5 判空取栈顶元素栈元…

Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)

运行有问题或需要全部源码请点赞关注收藏后评论区留言~~~ 一、循环视图RecyclerView 尽管ListView和GridView分别实现了多行单列和多行多列的列表,使用也很简单,可是它们缺少变化,风格也比较呆板,为此Android推出了更灵活多变的循…

CAS:1347750-20-2,NH2-PEG-SH,Amine-PEG-Thiol,氨基-聚乙二醇-巯基供应

1、名称 英文:NH2-PEG-SH,Amine-PEG-Thiol 中文:氨基-聚乙二醇-巯基 2、CAS编号:1347750-20-2 3、所属分类: Amine PEG Thiol PEG 4、分子量:可定制,5000、氨基-聚乙二醇 1000-巯基、1000、…

云计算———虚拟化技术镜像的构建及Harbor的使用(三)

一、容器管理 1.1容器命令 docker ps :查看正在运行的容器 ,已经关闭的不能查看 docker ps -a(显示所有容器) 可以 docker -f rm MyWordPress:-f 强制删除容器 [rootlocalhost ~]# docker ps -a -q #显示所有容器只…

java项目-第127期SpringBoot+vue的智慧养老手表管理系统-java毕业设计_计算机毕业设计

java项目-第127期SpringBootvue的智慧养老手表管理系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 本系统主要是通过智能手表监控老人的日常生活,比如血压、心率、睡眠步数、以及摔倒情况。 共分为两个角色:家长,养老院管理员&a…

有含金量的AI证书

文章目录证书展示企业认证介绍华为认证人工智能工程师课程内容我的总结和资料证书展示 这是华为云的AI认证: 这是阿里云的大数据认证: 企业认证介绍 一般的企业是办不起来认证的,大家肯定都知道的。本文主要介绍华为云的认证&#xff0c…

经典动态规划:最长递增子序列

力扣第300题:[最长递增子序列],这道题是非常经典的动态规划和二分查找的题目,我们先看dp: 第一种解法:动态规划 我们先看题目的示例1: 输入:nums [10,9,2,5,3,7,101,18] 输出:4 解释&#x…

【MySQL】MySQL数据库锁使用与InnoDB加锁的原理解析(MySQL专栏启动)

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

【Spring】Bean 的作用域和生命周期

文章目录1. Bean 的作用域1.1 通过一个案例来看 Bean 作用域的问题1.2 作用域的定义1.3 Spring Bean 支持的作用域(未介绍完全)1.4 修改 Bean 的作用域1.5 Bean 执行流程2. Bean 的生命周期2.1 Bean 的生命周期分为以下 5 大部分2.1.1 实例化 Bean&#…

【代码精读】在optee中注册一个中断

快速链接: . 👉👉👉 【代码精读】–Kernel/ATF/optee等-目录👈👈👈 付费专栏-付费课程 【购买须知】:本专栏的视频介绍-----视频👈👈👈概要: 在optee os总如何注册一个中断? 有没有类似于request_irq的程序? 注册了该中断后,是哪里将该中断配置成Secure…

保边滤波之基于测地距离的滤波与局部拉普拉斯滤波

(1)基于测地距离的滤波 给定图像I及其Hard Mask M,其中M(x)∈{0,1} ,M(x)0表示x属于前景,M(x)1表示x属于背景,图像中某点x到前面Hard Mask的测地距离为 ???d(a,b)表示…

机器学习中的数学原理——最小二乘法

这几天在刷B站的时候,有个深度学习的博主推荐了一本机器学习的书——《白话机器学习的数学》,抱着浅看一下的态度,我花3个大洋从淘宝上找到了这本书的电子版。看了两天我直接吹爆!!!所以这个专栏就分享一下…

《Linux驱动:DMA直接内存访问》

目录一、前言二、DMA传输主体三、S3c2440上的DMA3.1 DMA请求源3.2 DMA状态机3.3 DMA请求模式3.4 DMA服务模式3.5 DMA传输模式3.6 DMA读写数据大小3.7 DMA寄存器3.7.1 DCON寄存器其他几个重要位四、使用DMA4.1 软件触发DMA4.2 硬件源触发DMA一、前言 DMA(Direct Memory Aaccess…

SpringMVC框架中的拦截器

目录 1. 拦截器接口的介绍 2. 拦截器接口中方法的详细介绍 3. 配置拦截器的步骤 4. 多个拦截器的的执行情况 5. 拦截器与过滤器的区别 1. 拦截器接口的介绍 2. 拦截器接口中方法的详细介绍 public class MyInterceptor implements HandlerInterceptor {Overridepublic bo…