Java(七)——多态

个人简介

👀个人主页: 前端杂货铺
开源项目: rich-vue3 (基于 Vue3 + TS + Pinia + Element Plus + Spring全家桶 + MySQL)
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍖开源 rich-vue3 🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js

🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

内容参考链接
Java基础(一)Hello World,8种数据类型,键盘录入
Java基础(二)数组,方法,方法重载
Java基础(三)类和对象、构造方法
Java基础(四)字符串、StringBuffer、StringBuilder、StringJoiner
Java基础(五)ArrayList
Java基础(六)继承

文章目录

    • 前言
    • 多态
    • 多态调用成员的特点
    • 多态的优势与弊端
    • 总结

前言

大家好,这里是前端杂货铺。

本篇文章,我们学习多态、多态调用成员的特点以及认识其优势与弊端。


多态

多态:同类型的对象,表现出的形态不同。

多态的表现形式:父类类型 对象名称 = 子类对象。Fu f = new Zi()

多态的前提:有继承关系、有父类引用指向子类对象、有方法重写。

多态的好处:使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。

假如我们现在有一个教务系统,存在管理员、老师、学生三种身份,我们通过类来打印他们各自的信息,我们要怎么设计呢?

Test.java

package com.javabasic.polymorphism;

public class Test {
    public static void main(String[] args) {
        // 创建三个对象,并调用register方法
        Student student = new Student();
        student.setName("前端杂货铺");
        student.setAge(20);

        Teacher teacher = new Teacher();
        teacher.setName("张三");
        teacher.setAge(30);

        Admin admin = new Admin();
        admin.setName("管理员");
        admin.setAge(25);

        register(student);
        register(teacher);
        register(admin);
    }

    // 此方法既能接收老师,又能接收学生,还能接收管理员
    // 只能把参数写成这三个类型的父类
    public static void register(Person p) {
        p.show();
    }
}

Person 父类,用于显示子类对象实例的信息。

Person.java

package com.javabasic.polymorphism;

public class Admin extends Person {
    @Override
    public void show() {
        System.out.println("管理员的信息:" + getName() + ", " + getAge());
    }
}

Person 的子类 Admin,打印管理员的信息。

Admin.java

package com.javabasic.polymorphism;

public class Admin extends Person {
    @Override
    public void show() {
        System.out.println("管理员的信息:" + getName() + ", " + getAge());
    }
}

Person 的子类 Teacher,打印老师的信息。

Teacher.java

package com.javabasic.polymorphism;

public class Teacher extends Person {
    @Override
    public void show() {
        System.out.println("老师的信息:" + getName() + ", " + getAge());
    }
}

Person 的子类 Student,打印学生的信息。

Student.java

package com.javabasic.polymorphism;

public class Student extends Person {
    @Override
    public void show() {
        System.out.println("学生的信息:" + getName() + ", " + getAge());
    }
}

在这里插入图片描述


多态调用成员的特点

两句话:

  1. 调用成员变量的特点:编译看左边,运行也看左边
  2. 调用成员方法的特点:编译看左边,运行看右边

成员变量:在子类的对象中,会把父类的成员变量也继承下来。
成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。

接下来,我们进行调用成员变量和成员方法的测试:

package com.javabasic.demo;

public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog();

        // 调用成员变量:编译看左边,运行也看左边
        // 编译看左边:javac 编译代码时,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败
        // 运行也看左边:java 运行代码时,实际获取的就是左边父类中成员变量的值
        System.out.println(animal.name); // animal

        // 调用成员方法:编译看左边,运行看右边
        // 编译看左边:javac编译代码时,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败
        // 运行看右边:java运行代码时,实际上运行的是子类中的方法
        animal.show(); // dog --- show方法
    }
}

class Animal {
    String name = "animal";

    public void show() {
        System.out.println("Animal --- show方法");
    }
}

class Dog extends Animal {
    String name = "dog";

    @Override
    public void show() {
        System.out.println("dog --- show方法");
    }
}

class Cat extends Animal {
    String name = "cat";

    @Override
    public void show() {
        System.out.println("cat --- show方法");
    }
}

在这里插入图片描述


多态的优势与弊端

优势:方法中,使用父类型作为参数,可以接受所有子类对象。

弊端:不能使用子类的特有功能。

如果我们就是要调用子类中特有的功能该如何是好呢?—— 类型转换

package com.javabasic.demo;

public class Test {
    public static void main(String[] args) {
        Animal animal = new Dog();

        // 会报错,因为 animal 中不存在 eat()
        // animal.eat();


        // 解决方案:进行类型转换
        if (animal instanceof Dog dog) {
            dog.eat();
        } else if (animal instanceof Cat cat) {
            cat.sleep();
        } else {
            System.out.println("没有这个类型,无法转换");
        }
    }
}

class Animal {
    String name = "animal";

    public void show() {
        System.out.println("Animal --- show方法");
    }
}

class Dog extends Animal {
    String name = "dog";

    @Override
    public void show() {
        System.out.println("dog --- show方法");
    }

    public void eat() {
        System.out.println("dog --- 啃骨头");
    }
}

class Cat extends Animal {
    String name = "cat";

    @Override
    public void show() {
        System.out.println("cat --- show方法");
    }

    public void sleep() {
        System.out.println("cat --- sleep");
    }
}

在这里插入图片描述


总结

本篇文章,我们学习了多态的相关内容,并认识了多态调用成员的特点及多态的优势与弊端…

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. Java 基础(bilibili-黑马程序员)
  2. 菜鸟教程–Java

在这里插入图片描述


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

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

相关文章

Go语言如何入门,有哪些书推荐?

Go 语言之所以如此受欢迎,其编译器功不可没。Go 语言的发展也得益于其编译速度够快。 对开发者来说,更快的编译速度意味着更短的反馈周期。大型的 Go 应用程序总是能在几秒钟之 内完成编译。而当使用 go run编译和执行小型的 Go 应用程序时,其…

VMware虚拟机搭建CentOS7环境

相关资料 安装VMware 双击VMware-workstation(16.1.1软件安装包.exe安装文件,点下一步 激活码文件复制激活码激活安装linux 1、点击创建虚拟机

Open3D 删除点云中重叠的点(方法一)

目录 一、概述 二、代码实现 三、实现效果 3.1原始点云 3.2处理后的点云 3.3计算结果 一、概述 在点云处理中,重叠点(即重复点)可能会对数据分析和处理的结果产生负面影响。因此,删除重叠点是点云预处理中常见且重要的步骤。…

【网络安全】实验一(网络拓扑环境的搭建)

一、本次实验的实验目的 学习利用 VMware 创建虚拟环境 学习利用 VMware 搭建各自网络拓扑环境 二、创建虚拟机 三、克隆虚拟机 选择克隆的系统必须处于关机状态。 方法一: 方法二: 需要修改克隆计算机的名字,避免产生冲突。 四、按照要求完…

机器学习原理之 -- 神经网络:由来及原理详解

神经网络(Neural Networks)是受生物神经系统启发而设计的一类计算模型,广泛应用于图像识别、语音识别、自然语言处理等领域。其基本思想是通过模拟人脑神经元的工作方式,实现对复杂数据的自动处理和分类。本文将详细介绍神经网络的…

Scrapy框架的基本使用教程

1、创建scrapy项目 首先在自己的跟目录文件下执行命令: PS D:\BCprogram\python_pro\bigdata> scrapy startproject theridion_grallatorscrapy startproject 项目名 具体执行操作如下:1、创建项目目录:Scrapy会在当前工作目录下创建一…

【python中级】图像从从笛卡尔坐标系转换为极坐标系

【python中级】图像从从笛卡尔坐标系转换为极坐标系 1.背景2.生成二维图3.极坐标转换1.背景 笛卡尔坐标系就是我们常说的直角坐标系。 笛卡尔坐标系,也称为直角坐标系,是由法国数学家和哲学家勒内笛卡尔(Ren Descartes)发明的一种二维或三维坐标系统。它使用两个或三个相互…

【Qt】Qt开发环境搭建

目录 一. Qt SDK的下载&安装 二. Qt相关工具介绍 Qt的常用开发工具有: Qt CreatorVisual StudioEclipse 一. Qt SDK的下载&安装 Qt 下载官网: http://download.qt.io/archive/qt/ 国内清华源: https://mirrors.tuna.tsinghua.edu.cn/qt/arc…

C# WinForm —— 37 TabControl 控件介绍

1. 简介 管理一个TabPages集合的控件,也是一个分组控件 如果一个模块有多个子页面,可以使用TabControl控件进行页面切换 2. 属性 属性解释(Name)控件ID,在代码里引用的时候会用到Enabled控件是否启用Alignment确定选项卡是否显示在控件的…

扩散模型笔记2

Ref:扩散模型的原理及实现(Pytorch) 在扩散模型中,每一步添加的噪声并不是完全一样的。具体来说,噪声的添加方式和量在每一步是根据特定的规则或公式变化的。这里我们详细解释每一步添加噪声的过程。 正向过程中的噪声添加&…

两种转5V的DCDC电路:

最大电流:5A 最大电流:3A 验证通过:RT8289GSP性能更佳,带载能力更强:

前端JS特效第22波:jQuery滑动手风琴内容切换特效

jQuery滑动手风琴内容切换特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xm…

Guitar Pro8.2让你的吉他弹奏如虎添翼!

亲爱的音乐爱好者们&#xff0c;今天我要跟大家安利一个让我彻底沉迷其中的神器——Guitar Pro8.2&#xff01;这可不是一般的软件&#xff0c;它简直是吉他手们的福音。不管你是初学者还是老鸟&#xff0c;这个打谱软件都能给你带来前所未有的便利和价值。 让我们来聊聊Guita…

昇思25天学习打卡营第9天|ResNet50图像分类

一、Resnet残差网络模型 构建残差网络结构;Building BlockBottleneck 残差结构由两个分支构成&#xff1a;一个主分支 &#x1d439;(&#x1d465;)&#xff0c;一个shortcuts&#xff08;图中弧线表示,&#x1d465;&#xff09;。 得到残差网络结构:&#x1d439;(&#x…

python根据父母身高预测儿子身高

题目 从键盘输入父母的升高&#xff0c;并使用eval()或float()转换输入的数据类型。计算公式&#xff1a;儿子身高&#xff08;父亲身高母亲身高&#xff09;*0.54. father_heighteval(input(请输入爸爸的身高&#xff1a;)) mother_heighteval(input(请输入妈妈的身高&#…

RAID 冗余磁盘阵列

RAID也是Linux操作系统中管理磁盘的一种方式。 只有Linux操作系统才支持LVM的磁盘管理方式。 而RAID是一种通用的管理磁盘的技术&#xff0c;使用于多种操作系统。 优势&#xff1a;提升数据的读写速度&#xff0c;提升数据的可靠性。具体实现哪什么功能&#xff0c;要看你所…

YOLOv8结合SAHI推理图像和视频

文章目录 前言视频效果必要环境一、完整代码二、运行方法1、 推理图像2、 推理视频 总结 前言 在上一篇文章中&#xff0c;我们深入探讨了如何通过结合YOLOv8和SAHI来增强小目标检测效果 &#xff0c;并计算了相关评估指标&#xff0c;虽然我们也展示了可视化功能&#xff0c;…

Open3D 点云的圆柱形邻域搜索

目录 一、概述 1.1原理 1.2应用 二、代码实现 2.1完整代码 2.2程序说明 三、实现效果 3.1原始点云 3.2搜索后点云 一、概述 1.1原理 圆柱邻域搜索的基本思想是确定点云中的哪些点位于给定圆柱的内部。一个圆柱可以由以下几个参数定义&#xff1a; 中心点&#xff1a;…

SpEL表达式相关知识点

SpEL表达式 知识点 Spel概述 Spring 表达式&#xff0c;即 Spring Expression Language&#xff0c;简称 SpEL。 那么是什么SpEL表达式呢&#xff1f; SpEL (Spring Expression Language) 是一种在Spring框架中用于处理表达式的语言。SpEL中的表达式可以支持调用bean的方法…

如何利用Github Action实现自动Merge PR

我是蚂蚁背大象(Apache EventMesh PMC&Committer)&#xff0c;文章对你有帮助给项目rocketmq-rust star,关注我GitHub:mxsm&#xff0c;文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com 1. 引言 GitHub Actions 是 GitHub 提供的一种强大而灵活的自…