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

多态

概念

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

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

    • 有继承/实现关系(继承是类和类之间的关系,实现是类和接口直接的关系)
    • 有方法重写(继承之后,要对方法进行重写)
    • 有父类的引用指向子类的对象。例如: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();*/}
    }
    

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

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

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

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

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

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

相关文章

【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 概述

【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 概述-CSDN博客 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行环境搭建-CSDN博客 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行模式-CSDN博客 1、 Hadoop 是什么 (1)Hadoop是一个由Apache基…

全屏字幕滚动APP:12月份广告总收:84.89元(2023年12月份) 穿山甲SDK接入收益·android广告接入·app变现·广告千展收益·eCPM收益

接入穿山甲SDK app示例: android 数独小游戏 经典数独休闲益智 广告接入示例: Android 个人开发者如何接入广告SDK,实现app流量变现 2023年12月份,总新增用户1242 友盟统计: 12月份:总新增用户1242 2023年12月份…

OpenCV-15位运算

OpenCV中的逻辑运算就是对应位置的元素进行与、或、非和异或。 Opencv与Python不同的是:OpenCV中0的非反过来是255,255反过来是0。 但是Python中255非为-256。 一、非运算 使用API---cv.bitwise_not(str) 示例代码如下: import cv2 imp…

QT_01 安装、创建项目

QT - 安装、创建项目 1. 概述 1.1 什么是QT Qt 是一个跨平台的 C图形用户界面应用程序框架。 它为应用程序开发者提供建立艺术级图形界面所需的所有功能。 它是完全面向对象的,很容易扩展,并且允许真正的组件编程。 1.2 发展史 1991 年 Qt 最早由奇…

idea 弹框提示:Server‘s certificate is not trusted 解决办法

如图所示: 引起这个的根本原因:是因为你破解了idea,在本地hosts配置了映射,然后idea检测出来弹出警告 服务器证书不可用。所以在弹出这个框。 解决方法: 打开idea--->File-->Settings-->Tools-->点击Server Certifi…

新一代爬取JavaScript渲染页面的利器-playwright(一)

Playwright的使用 Playwright是微软在2020年初开源的一款新一代自动化测试工具,其功能和**Selenium**、Pyppeteer类似,都可以驱动浏览器进行自动化操作,但是也具备了Selenium、Pyppeteer不具备的更好的API,是新一代爬取JavaScrip渲…

SpringBoot日志打印Logback详解【子节点详解】【附案例】

笑小枫的专属目录 1. 背景2. 什么是Logback3. SpringBoot使用logback介绍4. 自定义logback配置5. 如何把日志同步到ES中6. logback配置属性详解根节点< configuration>子节点:< property>子节点:< appender>filetargetappendprudentlayout和encoderlayout和e…

【KingbaseES】实现MySql函数Field

CREATE OR REPLACE FUNCTION field(value TEXT, VARIADIC arr TEXT[]) RETURNS INT AS $$ DECLAREi INT; BEGINFOR i IN 1 .. array_length(arr, 1) LOOPIF arr[i] value THENRETURN i;END IF;END LOOP;RETURN 0; END; $$ LANGUAGE plpgsql IMMUTABLE;

使用qtquick调用python程序

一. 内容简介 使用qtquick调用python程序 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3pytorch 安装pytorch(http://t.csdnimg.cn/GVP23) 2.4QT 5.14.1 新版QT6.4,&#xff0c;6.5在线安装经常失败&#xff0c;而5.9版本又无法编译64位程序&#xf…

【DevOps-02】Code编码阶段工具

一、简要说明 在code阶段,我们需要将不同版本的代码存储到一个仓库中,常见的版本控制工具就是SVN或者Git,这里我们采用Git作为版本控制工具,GitLab作为远程仓库。 Git安装安装GitLab配置GitLab登录账户二、Git安装 Git官网 Githttps://git-scm.com/

Java业务功能并发问题处理

业务场景&#xff1a; 笔者负责的功能需要调用其他系统的进行审批&#xff0c;而接口的调用过程耗时有点长&#xff08;可能长达10秒&#xff09;&#xff0c;一个订单能被多个人提交审批&#xff0c;当订单已提交后会更改为审批中&#xff0c;不能再次审批&#xff08;下游系…

C++知识切片①:运算符重载之前置递增和后置递增

文章目录 前置递增的实现1.先写好main函数及头文件2.自定义MyInteger类3.重定义cout4.在类内实现前置递增 后置递增的实现完整代码 在进行运算符重载之前&#xff0c;不妨先看看常规的前置递增和后置递增的区别&#xff1a; 前置递增如a所示&#xff0c;a是先进行递增计算&…