Java学习之多态数组

news2024/10/7 4:31:22

目录

一、定义

二、举例说明

要求1

父类-Person

子类-Student

子类-Teacher

main类

运行结果

 要求2

 思路分析

main类中的代码

运行结果


一、定义

数组的定义类型为父类类型, 里面保存的实际元素类型为子类类型(也可以有父类)

二、举例说明

要求1

现有一个继承结构如下: 要求创建 1 个 Person 对象、 2 个 Student 对象和 2 个 Teacher 对象, 统一放在数组中, 并调用每个对象say 方法.

先按照要求创建父类和子类

父类-Person

package com.hspedu.poly_.polyarr_;

public class Person {
    int n1 = 200;
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //say()方法
    public String say() {
        return name + "\t" + age;
    }
}


子类-Student

package com.hspedu.poly_.polyarr_;

public class Student extends Person{
    int n1 = 100;
    private double score;

    public Student(String name, int age, double score) {
        super(name, age);
        this.score = score;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
    //重写父类say()方法

    @Override
    public String say() {
        return "学生" + super.say() + " score=" + score;
    }

}

子类-Teacher

package com.hspedu.poly_.polyarr_;

public class Teacher extends Person{
    int n1 = 300;
    private double salary;

    public Teacher(String name, int age, double salary) {
        super(name, age);
        this.salary = salary;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String say() {
        return "老师" + super.say() + " salary=" + salary;
    }
}

main类

在main类中创建多态数组,创建一个Person类的一维数组,保存的元素为Person类和其子类(运行类型)的对象

package com.hspedu.poly_.polyarr_;

public class PolyArr {
    public static void main(String[] args) {
        //新建一个int型一维数组有5个元素
        //int[] arr = new int[5];
        //新建一个Person型一维数组,有5个元素,即5个Person类的对象
        Person[] person = new Person[5];
        person[0] = new Person("jack", 23);
        //向上转型后,有两个Student对象和两个Teacher对象
        person[1] = new Student("bobby", 25, 65.5);
        person[2] = new Student("smith", 22, 80.6);
        person[3] = new Teacher("scott", 45, 14500);
        person[4] = new Teacher("james", 36, 8432.6);
        for (int i = 0; i < person.length; i++) {
            //动态绑定机制,会根据运行类型去查找方法
            //调用person[1].say()时,person[1]的运行类型是Student
            //会从Student类开始查找调用say()方法
            System.out.println(person[i].say());
        }

    }
}

运行结果

 要求2

如何调用子类特有的方法, 比如Teacher 有一个 teach , Student 有一个 study怎么调用?
在Student类和Teacher类中创建子类独有的方法

 

 思路分析

根据前面所学的知识,在向上转型后如果要调用子类独有的方法必须要将person[i]向下转型,

因为上述的person数组中的元素的运行类型有三种:Person、Student、Teacher,所以要先判断对象的运行类型,此时需要用到前面所学的instanceof(判断对象的运行类型是否为 XX 类型或 XX 类型的子类型)

main类中的代码

package com.hspedu.poly_.polyarr_;

public class PolyArr02 {
        public static void main(String[] args) {
            //新建一个int型一维数组有5个元素
            //int[] arr = new int[5];
            //新建一个Person型一维数组,有5个元素,即5个Person类的对象
            Person[] person = new Person[5];
            person[0] = new Person("jack", 23);
            //向上转型
            person[1] = new Student("bobby", 25, 65.5);
            person[2] = new Student("smith", 22, 80.6);
            person[3] = new Teacher("scott", 45, 14500);
            person[4] = new Teacher("james", 36, 8432.6);
            for (int i = 0; i < person.length; i++) {
                //动态绑定机制,会根据运行类型去查找方法
                //调用person[1].say()时,person[1]的运行类型是Student
                //会从Student类开始查找调用say()方法
                System.out.println(person[i].say());

                //    如何调用子类特有的方法, 比如Teacher 有一个 teach
                //    Student 有一个 study, 怎么调用?
                //    调用子类独有的方法,需要向下转型

                //先判断运行类型是不是Student类
                if (person[i] instanceof Student) {
                    /*
                    先向下转型,然后调用
                    Student student = (Student)person[i];
                    student.study();
                     */
                    //将以上两步合并成一步
                    ((Student) person[i]).study();
                } else if (person[i] instanceof Teacher) {
                    //原理同上
                    ((Teacher) person[i]).teach();
                } else if (person[i] instanceof Person) {

                } else {
                    System.out.println("你输入的类型有误,请重新检查");
                }

            }
        }
}

先判断,然后向下转型,然后调用
                    Student student = (Student)person[i];
                    student.study();

将上面两句合并
      ((Student) person[i]).study();             

运行结果

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

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

相关文章

Cat.1无线数据传输终端/Cat.1 DTU/LTE Cat.1 DTU/Cat 1模组功能

LTE Cat.1无线数传终端F2C16将借助成熟的LTE网络以更好的覆盖、更快的速度、更低的延时&#xff0c;完美取代传统2G/3G网络&#xff0c;为中低速率物联网行业提供优质的无线连接服务。 工业级芯片设计&#xff0c;设备稳定联网 ●全工业级芯片设计&#xff0c;宽温宽压&#xf…

「虚拟社交」爆火,资深玩家「当道」

⬆️“政企数智办公行业研究报告及融云新品发布会”明天直播&#xff01; 一切应用都将社交化。关注【融云全球互联网通信云】回复【融云】抽取高颜值大容量高端可乐保温杯哦~ 中国政企数智办公平台行业研究报告 融入社交能力&#xff0c;创造增长奇迹。激活用户在不同场景的社…

6个改善【客户体验】的自动电子邮件营销回复示例

关键词&#xff1a;客户体验、电子邮件营销 电子邮件自动回复器是将跨境电商的客户体验 (CX) 提升到一个新水平的一种方式。为了帮助跨境电商决定应该设置哪种自动电子邮件&#xff0c;我们汇总了对客户体验影响最大的 六个电子邮件自动回复示例。 这里有一些统计数据可以正确看…

国内各行业领域是否能通过与元宇宙和虚拟数字人的结合振兴数藏经济?

在过去几年&#xff0c; NFT和数字藏品已被广泛用于数字经济。 根据中国数字藏品行业协会早在2021年发布的市场发展报告中就指出了当年中国数字藏品市场规模达到2166亿元。 今年&#xff0c;国内元宇宙概念被炒得火热&#xff0c;从故宫博物院联合腾讯、网易等推出「故宫系列」…

关于C++11

文章目录&#x1f60d;C11优势&#x1f60e; 列表初始化&#x1f601;变量类型推导&#x1f44c;为什么需要类型推导&#x1f44d;decltype类型推导&#xff08;了解&#xff09;&#x1f61c;final 与 overridefinal&#x1f91e;override❤️默认成员函数控制&#x1f929;显…

TH10-数据统计与内容审核

TH10-数据统计与内容审核1、用户冻结解冻1.1 用户冻结ManageControllerManageService1.2 用户解冻ManageControllerManageService1.3 查询数据列表UserInfoManageService1.4 探花系统修改UserFreezeService2、数据统计2.1 数据采集2.1.1 部署RabbitMQ2.1.2 消息类型说明2.1.3 实…

使用dd+hexdump命令修改环境变量的值和升级uboot

前言 这篇写的较细&#xff0c;使用dd擦除emmc本来就是比较危险的事情&#xff0c;所以一定要细致。哪里没看明白的&#xff0c;赶紧留言问我&#xff0c;可不能存有侥幸心理。 思路大概就是&#xff1a; 1 先从emmc把数据读出来&#xff0c;放一个镜像文件里&#xff0c;使…

【整理】Python全栈技术学习路线

【整理】Python全栈技术学习路线【阶段一】Python基础Linux【阶段二】多任务编程服务器前端基础【阶段三】数据库mini Web框架【阶段四】Dhango框架美多商城项目【阶段五】DRF框架美多商城后台【阶段六】项目部署Flask框架Hm头条【阶段七】人工智能基础推荐系统基础Hm头条推荐系…

带你了解extern “C“

1.extern “C” 这个语法是c的语法。我们知道在一个.c文件中调用另一个.c中实现的函数是没有任何问题的&#xff0c;一个.cpp文件调用另一个.cpp文件中实现的函数也是没有问题的。但是我们如果想要在一个.cpp文件调用另一个.c文件中实现的函数&#xff0c;或者在一个.c文件中调…

双调序列

目录 双调序列 思路: 代码: 时间复杂度: 总结: 题目链接: 双调序列 题目描述&#xff1a; XJ编程小组的童鞋们经常玩一些智力小游戏&#xff0c;某月某日&#xff0c;小朋友们又发明了一种新的序列&#xff1a;双调序列&#xff0c;所谓的双调呢主要是满足如下条件描述…

TensorFlow之分类模型-2

1 基本概念 2 文本分类与情感分析 获取数据集 加载数据集 训练数据集 性能设置 为了提升训练过程中数据处理的性能&#xff0c;keras技术框架提供数据集缓存的功能&#xff0c;使用缓存可以避免读取磁盘数据集时由于IO消耗太多而出现性能瓶颈的问题&#xff0c;如果数据集…

操作系统的主要功能是什么

操作系统的主要功能是进程管理、存储管理、设备管理、文件管理、作业管理。 计算机系统的资源可分为设备资源和信息资源两大类。 操作系统位于底层硬件与用户之间&#xff0c;是两者沟通的桥梁。 1、进程管理&#xff0c;其工作主要是进程调度&#xff0c;在单用户单任务的情…

opcj2-盘点几个常见的Java开源脚手架

很多人抱怨自己是CURDer&#xff0c;很多时候就是在简单的修修改改。如果不书序SSM&#xff08;Spring、SpringMVC和Mybatis&#xff09;套路的人可能开始的时候会感觉非常吃力。但是熟悉之后发现其实就这么回事。SpringMVC负责响应对外接口&#xff0c;Mybatis负责数据库的访问…

TF4-圈子功能

TF4-圈子功能1、首页推荐1.1、接口分析1.2、功能实现1.2.1 controller1.2.2 service1.2.3 API接口1.2.4 请求dto对象2、MongoDB集群3、圈子功能2.1、功能说明1.2、实现方案分析1.3、技术方案(重点)1.4、表结构设计4、圈子实现3.1、环境搭建3.1.1、mongo主键自增3.1.2、实体类Mo…

基于matlab的SVM支持向量机分类仿真,核函数采用RBF函数

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 支持向量机&#xff08;support vector machines, SVM&#xff09;是二分类算法&#xff0c;所谓二分类即把具有多个特性&#xff08;属性&#xff09;的数据分为两类&#xff0c;目前主流机器学…

如何清理 docker 磁盘空间 附讲解(全)

目录前言1. Docker System 命令1.1 docker system df1.2 docker system prune2. 冗余容器或镜像3. 限制容器日志前言 补充docker知识点&#xff0c;可看我之前的文章&#xff1a;Docker零基础从入门到精通&#xff08;全&#xff09; docker 镜像特别容易占空间&#xff0c;稍…

基于Redis实现高性能延时消息队列

最近在倒腾自建博客后端系统&#xff0c;需要用到延时任务的功能&#xff0c;但手头只有一套MySQL和Redis&#xff0c;如果搞一套MQ成本有点大&#xff0c;于是想着用redis实现延时消息队列。有些场景用数据库的定时扫表也能简单实现延时消息的功能&#xff0c;不过对于我这边的…

Bitmap,布隆过滤器初步了解

布隆过滤器使用教程 文章目录布隆过滤器使用教程1.背景2.什么是Bitmap3.布隆过滤器3.1 什么是布隆过滤器3.2 布隆过滤器的作用3.3 布隆过滤器的基本原理4.布隆过滤器的实现Guava和Redisson4.1 实现思路4.2 SpringBoot实现这些操作Bitmap,guava,redisson布隆过滤器1.背景 最近公…

redis知识点汇总

一、Redis的数据类型和数据结构 1、Redis五种数据类型 String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Hash&#xff08;哈希&#xff09;、Set&#xff08;集合&#xff09;和Sorted Set&#xff08;有序集合&#xff09;。 2、Redis的底层数据…

C# 数据类型分值类型及引用类型

一 程序中的变量与常量 程序的基本任务是&#xff1a;对数据进行处理&#xff1b; 数据分为变量(variable)与常量(literal) int age18; 变量是值可以改变&#xff0c;本质上是内存的空间&#xff0c;用来存储信息 常量的值是固定的&#xff0c;直接写出来的&#xff0c;称字面…