Java多态详解

news2024/11/19 19:39:58

前言

多态是同一个行为具有多个不同的表现形态或形式的能力

比如:

小阿giao,他是一名主播,同样也是一个人;
小阿giao是一个对象;
这个对象既有主播形态,也有人类形态;

即:一个对象,拥有多种形态,这就是对象的多态性

多态在代码中的体现

如何用代码来表现多态性?
其实就是一句话:父类引用指向子类对象

父类名称 对象名 = new 子类名称();

不一定非得是父类引用,还可以这样

接口名称 对象名 = new 实现类名称();

创建一个父类:

public class A {
    public void method() {
        System.out.println("父类方法");
    }
}

创建一个子类继承父类并覆盖重写父类的method方法:

class B extends A {
    @Override
    public void method() {
        System.out.println("子类方法");
    }
}

使用多态写法:

class Main {
    public static void main(String[] args) {
        A a = new B();
        a.method();
    }
}

运行结果:
在这里插入图片描述
输出的是子类的方法,如果父类有的方法子类没有覆盖重写,那么就会向上查找,即子类没有,就找父类。

再新建一个子类(这里,我们不去覆盖重写):

class C extends A {

}

调用一下这个方法:

class CMain {
    public static void main(String[] args) {
        A a = new C();
        a.method();
    }
}

运行结果:
在这里插入图片描述

小结

直接通过对象名称访问成员变量,等号左边你new了谁,优先用谁的方法,如果没有,则向上找

多态中成员方法的使用特点

有一句口诀:编译看左边,运行看右边
代码:
新建一个父类,写两个方法eat和摸鱼,注意,摸鱼方法是父类特有的,子类不覆盖重写:

public class Animal {
    public void eat() {
        System.out.println("动物吃东西");
    }

    public void 摸鱼() {
        System.out.println("动物在摸鱼");
    }
}

新建一个子类继承父类并覆盖重写父类的eat方法,然后写一个特定的方法run:

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫在吃鱼");
    }

    public void run() {
        System.out.println("猫在跑");
    }
}

调用一下各个方法:

class AnimalMain {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.eat();
        animal.摸鱼();
//        animal.run();   // 编译错误
    }
}

在这里插入图片描述
一行一行来解释:

  • 第三行:多态写法,父类引用指向子类对象;
  • 第四行:调用eat方法,因为eat方法父子类都有,所以优先使用子类的,输出:猫在吃鱼;
  • 第五行:调用摸鱼方法,这是父类特有的方法,子类没有,所以向上找,输出:动物在摸鱼;
  • 第六行:调用run()方法,这是子类的特有方法,口诀;编译看左边。左边是父类,父类中没有run()方法,所以编译报错(具体原因是:对象一旦向上转型为父类,那么就无法调用子类原本特有的内容,比如run方法)

成员变量与成员方法的对比

  • 成员变量:编译看左边,运行看右边
  • 成员方法:编译看左边,运行看右边

多态的好处

假设我们有三个类,都有work方法:

  • 员工类(父类)
work();	// 抽象的
  • 讲师类(子类)
work(); // 讲课
  • 助教类(子类)
work();	// 辅导

如果不用多态写法,只用子类:

Teacher t = new Teacher();
t.work();	// 老师讲课
Assistant a = new Assistant();
a.work();	// 助教辅导

我们唯一要做的事情就是调用work方法,不关心你是讲课还是辅导

如果使用多态写法:对比一下上面的代码

Employee t = new Teacher();
t.work();
Employee a = new Assistant();
a.work();

好处就一目了然了:无论右边new的时候换成哪个子类对象,等号左边调用的方法都不会改变。

对象的向上转型

对象的向上转型其实上面已经写过了,其实就是多态写法。
格式:

父类名称 对象名 = new 子类名称();
Animal animal = new Cat();

含义:

右侧创建一个子类对象,把它当作父类来看;
创建了一只猫,当作动物来看待

注意:向上转型一定是安全的,但是也有个弊端,一旦对象向上转型为父类,那么就无法调用子类原本特有的内容(解决方案:向下转型)

对象的向下转型

对象的向下转型,其实就是一个还原的动作
格式:

子类名称 对象名 = (子类名称) 父类对象;

含义:

将父类对象还原为本来的对象

简单来说,本来它是猫,经过向上转型为动物,再向下转型还原成猫。

Animal animal = new Cat();  // 本来是猫,向上转型为动物
Cat cat = (Cat) animal;		// 本来是猫,已经被当作是动物了,还原为猫

注意事项:

  • 必须保证对象本来创建的时候就是猫,才能向下转型为猫;
  • 如果对象创建的时候不是猫,现在非要向下转型为猫,你说是不是沙雕?爆粗:
    ClassCastException

使用instanceof关键字进行类型判断

有一个问题:如何知道一个父类引用的对象,本来是什么子类?
简单来说,就是你怎么知道父类的引用指向的本来就是猫还是狗呢?
答案是:使用关键字 instanceof

格式:

对象名称 instanceof 子类名称

返回的是一个boolean类型:

class InstanceMain {
    public static void main(String[] args) {
        Animal animal = new Cat(); // 本来是猫
        animal.eat();               // 猫吃鱼

        // 如果希望使用子类特有的方法,需要向下转型
        if (animal instanceof Cat) {    // true
            Cat cat = (Cat) animal;
            cat.run();          // 猫在跑
        }
    }
}

运行结果:
在这里插入图片描述
注意:使用向下转型,一定要使用instanceof关键字进行判断,避免ClassCastException异常。

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

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

相关文章

醛基-PEG-纤维二糖 Cellobiose-CHO 纤维二糖-醛基

醛基-PEG-纤维二糖 Cellobiose-CHO 纤维二糖-醛基 羰基中的一个共价键跟氢原子相连而组成的一价原子团,叫做醛基,醛基结构简式是-CHO,醛基是亲水基团,因此有醛基的有机物(如乙醛等)有一定的水溶性。 中…

Unity有哪些适合拿来练手的游戏项目?

首先推荐一篇文章,其中涵盖海量Unity和C#的书籍、demo等海量干货。 文章链接:Unity 高级程序员应该具备怎样的能力?要怎样成长为 Unity 高级程序员? Unity有哪些适合练手的游戏项目?还是老规矩,全文无付费…

【软件STM32cubeIDE下STM32F4xx使用DMA+定时器+推PWM+点亮灯带WS2812相关-进阶(全数据流版)】

2TOC (1)前言 (1)起源 最近作了有关ws2812灯带的后续测试,这源于一个简单的问题。 如果用STM32F4点灯带,每个DMA数据流都用上,那么可以点亮多少条灯带? 实际情况更加复杂些&#x…

JAVA EE,一文彻底聊明白

关于JAVA EE的论述,JAVA EE和Spring的论述在第二、三章节。 目录 1.JAVA的发展史 2.JAVA EE 3.JAVA EE和Spring 1.JAVA的发展史 JAVA语言于1995年面世,主要开发者为——James Gosline,后被称为JAVA语言之父。最早该语言叫Oak,…

写给Java应用开发看的Elasticsearch调优手册

随着数据量的增长,MySQL在很多场景下,似乎已经无能为力了,所以有不少应用的数据从MySQL迁移到了Elasticsearch,我们的应用就在其中。由于开发时间紧张,所以仅仅只是了解了下Elasticsearch的基本知识,随便写…

[HDF5]如何使用CMake一起编译自己的代码和HDF5库

以一个实际项目来举例 目录 一.目录结构 二.CMakeLists.txt内容 三.执行CMakeLists命令 一.目录结构 1.build放CMake执行后生成的所有的内容,包括最后的工程或可执行文件等; 2.include放工程的头文件,以及HDF5的头文件,可以直接把HDF5中…

顶象业务安全情报——企业一眼“看透”黑灰产

不可否认,随着互联网的发展,黑灰产们也变得越来越“聪明”。它们不仅熟悉业务流程以及防护逻辑,并且能够熟练运用自动化、智能化的新兴技术实施攻击或诈骗行为,且极难识别。对购物、金融、社交、出行、教育、游戏等行业造成极大业…

3 个月前被裁员了,心情跌落谷底,直到我看到了这本神书…

3个月前的某一天,正在愉快的打工,突然被喊去谈话,然后就被辞退了。。 加入了找工作的大军 然而,因为疫情,因为大专学历的我,找工作比以往都艰难了许多 很多,纯粹就是因为学历,都不…

你想知道刷题的秘密吗?一篇博客让你明白什么是OJ题,如何刷OJ题,并深入浅出的带你刷遍顺序表的OJ题(小白必看)

目录 0.前言 1.什么是OJ 1.1 OJ简述 1.2 OJ的分类(尤其接口型OJ,带你剖析得明明白白) 1.3 接口型OJ的输入型参数 2. 剑指 Offer 56 - I. 数组中数字出现的次数 3. 88. 合并两个有序数组 4. 27.移除元素 5. 26. 删除有序数组中的重复…

Linux系统配置JDK环境变量

1、下载 1.1、Oracle官方下载地址:https://www.oracle.com/cn/java/technologies/downloads/#java8 1.2、同意协议,并点击Download 1.3、账号密码登录,没有可以创建一个 1.4、登录成功后就直接下载了 2、配置 2.1、下载好的压缩包上传到Lin…

FreeRTOS第一个任务的创建和调度详解(SVC异常)

在上一篇文章中,我详细分析了FreeRTOS中上下文切换:基于Cortex-M的RTOS上下文切换详解及FreeRTOS实例 但是第一个任务没有上下文,它是怎么运行的呢? 1 创建任务 如果我们没有创建任务的话,系统也有一个空闲任务用来…

【 java 集合】使用迭代器 Iterator 遍历集合

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

空气源热泵设备远程监控的优点

空气源热泵热水器是一种节能、环保、安全的新能源产品,也是家庭采暖、生活热水及空调制冷等方面的最佳选择。 在使用时,只需一次少量的电能就能实现连续制热和制冷,其制热效率是燃气热水器、电热水瓶和燃油热车等供热设备的数倍,因…

亿联会议系统操作使用全教程

环境: 终端VC800 亿联会议pc.v4.2.11 教程: 一、下载安装亿联会议PC/手机APP 官网下载 1.以下教程为Windows版演示 2.安装亿联会议软件(具体操作按软件提示步骤进行) 3.注册账号 3.1点击免费注册按钮,自动跳转至…

SCI投稿经验分享:成功发表一篇中科院2区智能物联网类SCI真的不难

我是如何用三个月成功发表一篇TOP 【本期推荐】本期小编分享点不一样的内容。关注小编三个月以上的铁粉可能会留意到七月份本协会新增了一本计算机智能物联网类1区TOP刊,该刊一经推出就受到了广大作者的纷纷投稿。奈何期刊合作期刊编辑严格控制版面,所以…

配电网络扩展规划:考虑使用概率性能源生产和消费概况的决策(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🎉作者研究:🏅🏅🏅主要研究方向是电力系统和智能算法、机器学…

Java开发学习(三十一)----Maven属性与版本管理

一、属性 1.1 问题分析 如下图所示 你会发现,如果现在想更新Spring的版本,你会发现依然需要更新多个jar包的版本,这样的话还是有可能出现漏改导致程序出问题,而且改起来也是比较麻烦。 问题清楚后,我们需要解决的话…

SpringBoot 打 jar包和打war 包配置

文章目录1. 前言2. SpringBoot 打 jar 包3. SpringBoot 打 war 包4.小结1. 前言 目前我们熟知的SpringBoot 打包方式,一共分为两种,一种是打jar 包(内置tomcat 方式,yml 里的配置参数生效包括端口,和servlet 的contex…

EndNote参考文献导入

简介 本文介绍如何在Word作文过程中借助EndNote管理参考文献,关于如何将参考文献导入到EndNote中这里不做说明,假定需要的文献均已经导入。 具体步骤 为什么需要文献管理工具来生成参考文献呢?最核心的原因就是自动控制的,文献的…

JAVA SCRIPT设计模式--结构型--设计模式之ADAPTER适配器(6)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代…