Java(七)——多态

news2024/10/6 9:23:17

个人简介

👀个人主页: 前端杂货铺
开源项目: 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

在这里插入图片描述


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

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

相关文章

Arcgis Api 三维聚合支持最新版API

Arcgis Api 三维聚合支持最新版API 最近有同学问我Arcgis api 三维聚合,官方还不支持三维聚合API,二维可以。所以依旧是通过GraphicLayers 类来实现,可支持最新Arcgis Api版本 效果图:

【APK】SDKManager运行后闪退

本地JDK已安装,且配置了环境变量,未安装 android studiio 问题描述:右键以管理员身份运行 SDKManager,终端窗口闪退 问题原因:未找到正确的Java路径 解决办法: 1.修改tools目录下的 android.bat 文件&am…

0301STM32GPIO外设输出

STM32GPIO外设输出 STM32内部的GPIO外设GPIO简介基本结构GPIO位结构输入部分:输出部分: GPIO八种工作模式浮空/上拉/下拉输入模拟输入开漏/推挽输出复用开漏/推挽输出 手册寄存器描述GPIO功能描述外设的GPIO配置GPIO寄存器描述端口输入数据寄存器端口输出…

Kafka第四篇——生产数据总体概括,源码解析分区策略,数据收集器,Sender发送线程,key值

目录 流程图以及总体概述 拦截器 分区器以及分区计算策略 为啥进行分区计算? producer生产者怎么知道有哪些分区? 分区计算 如何自定义实现分区器? 想说的在图里啦!宝宝!💡 ​编辑 如果key值忘记传递了呢&a…

Vue移动端地图App:van-uploader导致的卡顿问题

问题描述 基于Vue3+Vant IU 4开发的移动端地图App,在进行地图点位上报、上报记录查看过程中,出现App卡顿、甚至闪退的问题,进行问题定位之后,发现是van-uploader组件导致的问题。 van-uploader文件上传组件 van-uploader组件用于将本地的图片或文件上传至服务器,并在上传…

园区、社区、乡村的智能管理

智慧园区、社区、乡村管理系统是现代信息技术在城市化进程中的重要应用,它们通过集成多种技术手段,实现对园区、社区、乡村的全面、高效、智能化管理。以下是对这三种管理系统的详细阐述: 一、智慧园区管理系统 1. 定义与目的 智慧园区管理系统是运用物联网、云计算、大数…

Canal架构以及使用规范

Canal架构以及使用规范 一、Canal的作用 相关文档:GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可…

【做一道算一道】和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2 示例 2: 输入:nums [1,2,3],…

分布式整合

一、分布式架构介绍 什么是分布式系统 分布式系统指一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。 通俗的理解,分布式系统就是一个业务拆分成多个子业务,分布在不同的服务器节点&#xff0…

【数据结构与算法】快速排序霍尔版

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​

找不到x3daudio1_7.dll怎么修复?一招搞定x3daudio1_7.dll丢失问题

当你的电脑突然弹出提示,“找不到x3daudio1_7.dll”,这时候你就需要警惕了。这往往意味着你的电脑中的程序出现了问题,你可能会发现自己无法打开程序,或者即便打开了程序也无法正常使用。因此,接下来我们要一起学习一下…

【简单介绍下Memcached】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

LabVIEW从测试曲线中提取特征值

在LabVIEW中开发用于从测试曲线中提取特征值的功能时,可以考虑以下几点: 数据采集与处理: 确保你能够有效地采集和处理测试曲线数据。这可能涉及使用DAQ模块或其他数据采集设备来获取曲线数据,并在LabVIEW中进行处理和分析。 特…

Wormhole Filters: Caching Your Hash on Persistent Memory——泛读笔记

EuroSys 2024 Paper 论文阅读笔记整理 问题 近似成员关系查询(AMQ)数据结构可以高效地近似确定元素是否在集合中,例如Bloom滤波器[10]、cuckoo滤波器[23]、quotient滤波器[8]及其变体。但AMQ数据结构的内存消耗随着数据规模的增长而快速增长…

Kubernetes集群性能测试之kubemark集群搭建

Kubernetes集群性能测试之kubemark集群搭建 Kubemark是K8s官方提供的一个对K8s集群进行性能测试的工具。它可以模拟出一个K8s cluster(Kubemark cluster),不受资源限制,从而能够测试的集群规模比真实集群大的多。这个cluster中ma…

针对tcp不出网打——HTTP隧道代理(以CFS演示)

目录 上传工具到攻击机 使用说明 生成后门文件 由于电脑短路无法拖动文件,我就wget发送到目标主机tunnel.php文件​ 成功上传​ 可以访问上传的文件 启动代理监听 成功带出 后台私信获取弹药库工具reGeorg 上传工具到攻击机 使用说明 生成后门文件 pyt…

Android OpenGL ES 离屏幕渲染2——获取渲染结果并显示到ImageView控件中,使用最简模型展示

简介: 紧接上文,本文将用一个不包含顶点shader和片元shader的最小模型讲述如何把通过EGL创建的OpenGL ES环境渲染后的结果进行提取,单纯输出一片铺满视口的红色的像素。 EGL环境创建逻辑: 先看完整代码: package com.c…

异常组成、作用、处理方式(3种)、异常方法、自定义异常

目录 异常的组成:运行异常与编译异常 两者区别:编译异常用来提醒程序员,运行异常大部分是由于参数传递错误导致 异常作用: 作用1:就是平时的报错,方便我们找到报错的来源 作用2:在方法内部…

华为机试HJ51输出单向链表中倒数第k个结点

华为机试HJ51输出单向链表中倒数第k个结点 题目: 想法: 因为要用链表,且要找到倒数第k个结点,针对输入序列倒叙进行构建链表并找到对应的元素输出。注意因为有多个输入,要能接受多次调用 class Node(object):def __…

[Godot3.3.3] – 人物死亡动画 part-2

前言 在上一个 part 中已经完成了大部分的逻辑,现在进行一些新的修改。 增加重力 首先将 PlayerDeath 中的 AnimationPlayer 设置为自动播放。 返回 PlayerDeath.gd 并增加一个重力 300,防止玩家的尸体腾空运动。 var gravity 1000 _process 函数中…