面向对象的三大特征之一多态

多态

概念

  • 多态是同一个对象,在不同时刻表现出来不同的形态,称之为多态。

    • 例如:水,我们把水理解成为一个对象,而水会有不同的形态,比如 液态水、冰块、水蒸气
  • 多态的前提

    • 有继承/实现关系(继承是类和类之间的关系,实现是类和接口直接的关系)
    • 有方法重写(继承之后,要对方法进行重写)
    • 有父类的引用指向子类的对象。例如:Animal a = new Cat();
  • 多态成员的访问特点(非常重要,一定得理解,请先看口诀,再结合图片下方注意文字,和图片理解)

    • 口诀(父类是左边,子类是右边):

      • 对于成员变量,编译看左边,执行看左边
      • 对于成员方法,编译看左边,执行看右边

      注意:

      ​ ①:先解释下口诀,编译看左边,也就是看左边有无这个成员,有的话编译才通过,我们可以看到图片一和图片二两张都是因为左边父类中无 爆红的这个成员,所以报错

      ​ ②:对于成员变量,编译看左边(也就是看左边父类中有无这个成员,有的话编译通过),执行看左边(我们看第三张图,可以看到最中运行的结果是左边父类中的成员变量值)

      ​ ③:对于成员方法,编译看左边(也就是看左边父类中有无这个成员,有的话编译通过),执行看右边(我们看第三张图,可以看到最中运行的结果是右边子类中的成员方法,因为方法重写了)

多态的好处和弊端

  • 好处:提高了程序的扩展性,定义方法的时候,使用父类作为参数,将来在使用的时候使用具体的子类参与操作

  • 弊端:不能使用子类特有的功能(必须父类中有【回想口诀,只有编译通过才行】)

多态的转型

  • 多态的弊端是,不能使用子类特有的功能,怎么办呢?就提出我们多态的转型。

    类型方向
    向上转型从子到父父类引用指向子类对象Animal a = new Cat();
    向下转型从父到子父类引用转为子类对象Cat b = (Cat)a

    注意:向下转型,有个前提,得是同一种对象

    ​ Animal a = new Cat(); // a 是Animal类型,但是本质是 猫

    ​ Dog d = (Dog)a; // 很明显这行就错了,(Dog)a 相当于强转,但是 猫怎么能转成狗呢!

    // 动物类
    class Animal{
        public void show(){
            System.out.println("动物!");
        }
    }
    // 狗类
    class Dog extends Animal{
        public void show(){
            System.out.println("狗!");
        }
        public void speak(){
            System.out.println("汪汪");
        }
    }
    // 猫类
    class Cat extends Animal{
        public void show(){
            System.out.println("猫!");
        }
        public void eat(){
            System.out.println("小鱼干");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            // 向上转型
            Animal a = new Cat();
            Animal b = new Dog();
            // 调用方法(父类对象调用,多态的形式,记得口诀)
            a.show();
            b.show();
            // 编译不通过,因此爆红
    /*        a.speak();
            a.eat();*/
    
            // 向下转型
            Cat c = (Cat)a;
            Dog d = (Dog)b;
            // 调用方法(子类对象调用)
            c.eat();
            c.show();
            d.speak();
            d.show();
    
    /*        Cat c1 = (Cat)b;
            c1.speak();*/
        }
    }
    

  • 多态很重要,一定要理解!!!

  • 其他两大特征可参考下面这两篇文章:

    • 面向对象的三大特征之一继承

    • 面向对象的三大特征之一封装

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新手深入浅出理解PyTorch归一化层全解析

目录 torch.nn子模块normal层详解 nn.BatchNorm1d BatchNorm1d 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.BatchNorm2d BatchNorm2d 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.BatchNorm3d BatchNorm3d 函数简介 参…

KeyError: ‘model_state_dict‘

问题 加载模型权重文件时获取model_state_dict键失败 解决 单步调试发现保存模型权重时正确保存了该键值对,再次调试时发现莫名奇妙又没错了 首先确认保存模型时的状态字典键名:确保在保存模型权重时,正确地使用了 model.state_dict() 方法…

飞书文档如何转markdown

飞书文档如何转markdown 实现效果实现步骤其他方法 实现效果 导出的结果挂在这了 https://thinkasany.github.io/docs/#/ 实现步骤 以https://upyun.feishu.cn/docx/KERsd1DpioPb1xxye9VcuXbhnBC这篇文章为例 使用工具 https://github.com/Wsine/feishu2md,提供了…

【计算机算法设计与分析】棋盘覆盖问题(C++_分治法)

文章目录 题目描述测试样例算法原理算法实现参考资料 题目描述 在一个 2 k 2 k 2^k \times 2^k 2k2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一个特殊方格,且称该棋盘为一个特殊棋盘。显然,特殊方格在棋…

腾讯云Centos9使用docker的方式安装APISIX

在虚拟机中安装Docker、Docker-compose 安装Docker 清除旧版本的docker yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装docker的依赖 yum install -y yum-utils device-ma…

在k8s集群中部署多nginx-ingress

关于ingress的介绍,前面已经详细讲过了,参考ingress-nginx详解和部署方案。本案例ingress的部署使用deploymentLB的方式。 参考链接: 多个ingress部署 文章目录 1. 下载ingress的文件2. 文件资源分析3. 部署ingress3.1 部署第一套ingress3.1…

快速、准确地检测和分类病毒序列分析工具 ViralCC的介绍和详细使用方法,fudai shiyong ijaoben

介绍 viralcc是一个基因组病毒分析工具,可以用于快速、准确地检测和分类病毒序列。 github:dyxstat/ViralCC: ViralCC: leveraging metagenomic proximity-ligation to retrieve complete viral genomes (github.com) Instruction of reproducing resul…

BERT(从理论到实践): Bidirectional Encoder Representations from Transformers【3】

这是本系列文章中的第3弹,请确保你已经读过并了解之前文章所讲的内容,因为对于已经解释过的概念或API,本文不会再赘述。 本文要利用BERT实现一个“垃圾邮件分类”的任务,这也是NLP中一个很常见的任务:Text Classification。我们的实验环境仍然是Python3+Tensorflow/Keras…

sql:定时执行存储过程(嵌套存储过程、使用游标)

BEGINDeclare FormNo nvarchar(20) --单号Declare Type nvarchar(50) --类型Declare PickedQty float -Declare OutQty float Declare 生产量 floatDeclare 已装箱数量 float Declare 已入库数量 floatDeclare 损耗数量 float Declare 退货品出库数量 intdeclare k c…

DrGraph原理示教 - OpenCV 4 功能 - 膨胀腐蚀

在二值图的结果基础上,可针对性处理。 这些处理有些是概念上的,有些是原理上的,也有形态上的,那就看用途与目的了。 本质上还是对二值图的黑白点进行处理,以用于图像增强、边缘检测、图像分割等多个领域。比如膨胀与腐…

ubuntu创建pytorch-gpu的docker环境

文章目录 安装docker创建镜像创建容器 合作推广,分享一个人工智能学习网站。计划系统性学习的同学可以了解下,点击助力博主脱贫( •̀ ω •́ )✧ 使用docker的好处就是可以将你的环境和别人的分开,特别是共用的情况下。本文介绍了ubuntu环境…

信息论与编码期末复习——概念论述简答题(一)

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…

C++基础语法——基本知识、数据类型、运算符及程序流程结构

本专栏记录C学习过程包括C基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注。 当前章节处于: >第1阶段-C基础入门 ---------第2阶段实战-通讯…

一篇文章学会Vim

一篇文章学会Vim 声明:以下内容均为我个人的理解,如果发现错误或者疑问可以联系我共同探讨 简介 Vim是一个高度可定制的终端文本编辑器,它可以很方便的创建和修改任何类型的文本。作为vi的升级版,有许多新的特性(以下列出的特性…

Qt界面篇:Qt停靠控件QDockWidget、树控件QTreeWidget及属性控件QtTreePropertyBrowser的使用

1、功能介绍 本篇主要使用Qt停靠控件QDockWidget、树控件QTreeWidget及Qt属性控件QtTreePropertyBrowser来搭建一个简单实用的主界面布局。效果如下所示。 2、控件使用详解 2.1 停靠控件QDockWidget QDockWidget可以停靠在 QMainWindow 内或作为桌面上的顶级窗口浮动。默认值…

rollup 插件输出生成钩子

✨专栏介绍 Rollup专栏是一个专门介绍Rollup打包工具的系列文章。Rollup是一个现代化的JavaScript模块打包工具,它可以将多个模块打包成一个或多个文件,以提高应用程序的性能和加载速度。 在Rollup专栏中,您将学习到如何安装和配置Rollup&a…

如何选择合适的语音呼叫中心?

市场上不同的语音呼叫中心提供商,都有其独特的优势和不足。企业在选择语音呼叫中心服务公司时,主要考虑以下因素:服务质量、价格、技术支持、客户支持等。 首先,服务质量是选择语音呼叫中心需关注的最重要因素之一。 为确保语音…

虾皮广告数据分析:如何进行虾皮广告数据分析以优化广告效果

虾皮(Shopee)作为一家知名的电商平台,广告数据分析是优化广告效果的关键步骤。通过对广告数据进行深入分析,卖家可以了解广告的表现、找出优势和不足,并制定更有效的广告策略。在本文中,我们将介绍如何进行…

ElasticSearch深度分页解决方案

一、前言 ElasticSearch是一个基于Lucene的搜索引擎,它支持复杂的全文搜索和实时数据分析。在实际应用中,我们经常需要对大量数据进行分页查询,但是传统的分页方式在处理大量数据时会遇到性能瓶颈。本文将介绍ElasticSearch分页工作原理、深…

VM中安装Linux以及Win系统

目录 准备条件 安装RHEL9.3 步骤一:按照图片进行操作 步骤二:选择配置方式 步骤三:选择虚拟芯片 步骤四:安装镜像 步骤五:选择操作系统 步骤六:名字以及存储位置 步骤七:配置虚拟机参数…