多态的应用——数组多态

介绍

ai查询

在Java中,动态数组通常通过`ArrayList`类来实现,它是Java集合框架(Java Collections Framework)的一部分。`ArrayList`是一个可调整大小的数组实现,提供了比标准数组更多的灵活性和功能。
以下是使用`ArrayList`的一些基本示例代码:
### 创建一个动态数组(ArrayList)
```java
import java.util.ArrayList; // 导入ArrayList类
ArrayList<String> myList = new ArrayList<String>(); // 创建一个字符串类型的动态数组
```
### 向动态数组中添加元素
```java
myList.add("Apple"); // 添加元素
myList.add("Banana");
myList.add("Cherry");
```
### 访问动态数组中的元素
```java
String firstElement = myList.get(0); // 获取索引为0的元素
System.out.println("第一个元素是: " + firstElement);
```
### 修改动态数组中的元素
```java
myList.set(1, "Mango"); // 将索引为1的元素修改为"Mango"
```
### 删除动态数组中的元素
```java
myList.remove("Cherry"); // 删除指定的元素
myList.remove(0); // 删除索引为0的元素
```
### 获取动态数组的长度
```java
int size = myList.size(); // 获取动态数组的长度
System.out.println("动态数组的长度是: " + size);
```
### 遍历动态数组
```java
for (String item : myList) {
    System.out.println(item);
}
```
### 使用动态数组作为方法参数
```java
public void printArrayList(ArrayList<String> list) {
    for (String item : list) {
        System.out.println(item);
    }
}
```
### 动态数组的类型参数
`ArrayList`是泛型集合,可以存储任何类型的对象。例如,如果你想创建一个存储整数类型的动态数组,你可以这样做:
```java

ArrayList<Integer> myIntList = new ArrayList<Integer>();
myIntList.add(10); // 自动装箱(将int转换为Integer)
int number = myIntList.get(0); // 自动拆箱(将Integer转换为int)
```
这些示例展示了`ArrayList`的一些基本操作。在实际应用中,`ArrayList`提供了更多高级功能和用法,您可以根据具体需求来使用它们。
 

我们这里创造三个类。person,student类,teacher类

person类

package hansunping;
public class person{private String name;public int age;public person(String name,int age) {// TODO Auto-generated constructor stubthis.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;}public String say() {//返回名字年龄return name+"\t"+age;}}

在您提供的代码中,`Person` 类是一个简单的Java类,它具有以下特点:
1. **私有属性**:`Person` 类有两个私有属性 `name` 和 `age`,这些属性用于存储人的名字和年龄。
2. **构造函数**:`Person` 类有一个构造函数,它接受两个参数 `name` 和 `age`,并使用这些参数来初始化对象的属性。
3. **公共的 Getter 和 Setter 方法**:`Person` 类为 `name` 和 `age` 属性提供了公共的 Getter 和 Setter 方法。这些方法允许外部代码读取和修改 `Person` 对象的 `name` 和 `age` 属性。
4. **say 方法**:`Person` 类有一个名为 `say` 的方法,它返回一个包含 `name` 和 `age` 属性值的字符串。这个方法可以用来输出一个人的基本信息。
5. **继承**:`Person` 类被设计为可以被其他类继承。在您的代码中,`Student` 和 `Teacher` 类都继承自 `Person` 类。
6. **多态性**:由于 `Student` 和 `Teacher` 类继承自 `Person` 类,它们可以使用 `Person` 类的引用变量。在Java中,这体现了多态性,即子类对象可以被视为父类对象,但仍然保留了子类的特性。
在您的 `main` 方法中,您创建了一个 `Person` 类型的数组 `persons`,并填充了不同类型的对象(`Person`、`Student` 和 `Teacher`)。当您遍历这个数组并调用每个元素的 `say` 方法时,Java虚拟机会根据对象的实际类型来调用相应的 `say` 方法,这展示了多态性的运行时绑定特性。
如果您想要查看 `Person` 类的具体实现,请提供 `Person` 类的完整代码,我可以为您提供更详细的分析。
 

student类

package hansunping;public class student extends person {private String name;public int age;private double score;public double getScore() {return score;}public void setScore(double score) {this.score = score;}public student( String name,int age, double score) {// TODO Auto-generated constructor stubsuper(name, age);this.score=score;}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;}@Override//重写父类say方法public String say() {//返回名字年龄return super.say()+"scor="+score;}
}

根据您之前提供的 `Student` 类的代码,`Student` 类是 `Person` 类的子类。它继承了 `Person` 类的所有属性和方法,并添加了一些额外的属性和方法来表示学生的特定信息。以下是 `Student` 类的基本结构和特点:
```java
package hansunping;
public class Student extends Person {
    private double score;
    public Student(String name, int age, double score) {
        super(name, age); // 调用父类的构造函数
        this.score = 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;
    }
}
```
1. **继承**:`Student` 类通过 `extends` 关键字继承自 `Person` 类。这意味着 `Student` 类继承了 `Person` 类的所有公共和保护的属性和方法。
2. **额外的属性**:`Student` 类添加了一个新的私有属性 `score`,用于存储学生的分数。
3. **构造函数**:`Student` 类有一个构造函数,它接受三个参数 `name`、`age` 和 `score`。构造函数首先调用父类 `Person` 的构造函数来初始化 `name` 和 `age` 属性,然后初始化 `score` 属性。
4. **公共的 Getter 和 Setter 方法**:`Student` 类为 `score` 属性提供了公共的 Getter 和 Setter 方法,允许外部代码读取和修改学生的分数。
5. **方法重写**:`Student` 类重写了 `Person` 类的 `say` 方法。在 `Student` 类的 `say` 方法中,首先调用了 `super.say()` 来获取父类的 `say` 方法的输出,然后添加了学生的分数信息。
通过继承和重写,`Student` 类能够扩展 `Person` 类的功能,以包括学生的特定信息。这样,`Student` 对象既可以作为 `Person` 对象使用,也可以使用 `Student` 类的额外功能。

teacher类

package hansunping;public class student extends person {private String name;public int age;private double score;public double getScore() {return score;}public void setScore(double score) {this.score = score;}public student( String name,int age, double score) {// TODO Auto-generated constructor stubsuper(name, age);this.score=score;}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;}@Override//重写父类say方法public String say() {//返回名字年龄return super.say()+"scor="+score;}
}

您之前没有提供 `Teacher` 类的代码,但我可以根据您的描述和通常的编程实践来给您一个 `Teacher` 类的基本示例。假设 `Teacher` 类也继承自 `Person` 类,并且有一个额外的属性来表示教师的工资。以下是 `Teacher` 类的一个可能的实现:
```java
package hansunping;
public class Teacher extends Person {
    private double salary;
    public Teacher(String name, int age, double salary) {
        super(name, age); // 调用父类的构造函数
        this.salary = salary; // 初始化salary属性
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    // 重写父类的say方法
    @Override
    public String say() {
        return super.say() + " salary=" + salary;
    }
}
```
在这个示例中,`Teacher` 类具有以下特点:
1. **继承**:`Teacher` 类通过 `extends` 关键字继承自 `Person` 类,这意味着它继承了 `Person` 类的所有公共和保护的属性和方法。
2. **额外的属性**:`Teacher` 类添加了一个新的私有属性 `salary`,用于存储教师的工资。
3. **构造函数**:`Teacher` 类有一个构造函数,它接受三个参数 `name`、`age` 和 `salary`。构造函数首先调用父类 `Person` 的构造函数来初始化 `name` 和 `age` 属性,然后初始化 `salary` 属性。
4. **公共的 Getter 和 Setter 方法**:`Teacher` 类为 `salary` 属性提供了公共的 Getter 和 Setter 方法,允许外部代码读取和修改教师的工资。
5. **方法重写**:`Teacher` 类重写了 `Person` 类的 `say` 方法。在 `Teacher` 类的 `say` 方法中,首先调用了 `super.say()` 来获取父类的 `say` 方法的输出,然后添加了教师的工资信息。
通过这种方式,`Teacher` 类能够扩展 `Person` 类的功能,以包括教师的特定信息。这样,`Teacher` 对象既可以作为 `Person` 对象使用,也可以使用 `Teacher` 类的额外功能。

主类

package hansunping;public class demon1 {public static void main(String[] args) {person[] persons=new person[5];//你尝试创建一个名为 persons 的 Person 类型数组,该数组有5个元素:persons[0]=new person("jack", 20);persons[1]=new student("jack", 20,100);persons[2]=new student("smith", 18,30.1);persons[3]=new teacher("scott", 30,2000);persons[4]=new teacher("king", 30,2000);//循环遍历数组。调用sayfor (int i = 0; i < persons.length; i++) {System.out.println(persons[i].say());//动态绑定}//、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、//如果我们将student类的say()方法注销,他寻找student类的say方法无果后,会再向它的父类调用say方法。返回我是人类,效果等同于}}

您之前提供的 `demon1` 类是一个包含 `main` 方法的类,它演示了多态性的概念。在 `main` 方法中,您创建了一个 `Person` 类型的数组 `persons`,并填充了不同类型的对象(`Person`、`Student` 和 `Teacher`)。然后,您遍历这个数组并调用每个元素的 `say` 方法,这展示了多态性的运行时绑定特性。
以下是 `demon1` 类的代码示例,包括 `main` 方法中的内容:
```java
package hansunping;
public class Demon1 {
    public static void main(String[] args) {
        Person[] persons = new Person[5]; // 创建一个Person类型的数组
        persons[0] = new Person("Jack", 20);
        persons[1] = new Student("Jack", 20, 100);
        persons[2] = new Student("Smith", 18, 30.1);
        persons[3] = new Teacher("Scott", 30, 2000);
        persons[4] = new Teacher("King", 35, 2500);
        // 循环遍历数组,调用say方法
        for (int i = 0; i < persons.length; i++) {
            System.out.println(persons[i].say()); // 动态绑定
        }
    }
}
```
在这个示例中,`demon1` 类的 `main` 方法执行了

以下操作:
1. 创建了一个 `Person` 类型的数组 `persons`,长度为5。
2. 使用不同的构造函数填充数组,创建了 `Person`、`Student` 和 `Teacher` 的实例。
3. 通过循环遍历数组,并调用每个元素的 `say` 方法。由于 `Student` 和 `Teacher` 类都重写了 `Person` 类的 `say` 方法,因此调用 `say` 方法时会根据对象的实际类型来调用相应的方法。
4. 输出每个对象的 `say` 方法的返回值,这会显示每个对象的特定信息。
这个示例展示了多态性的一个关键特性:调用哪个方法是在运行时根据对象的实际类型决定的,而不是根据引用变量的类型决定的。这就是所谓的动态绑定。

特点

您提供的 `Person[] persons = new Person[5];` 语句创建了一个 `Person` 类型的数组,具有以下特点:
1. **类型指定**:这个语句指定了数组的类型为 `Person[]`,这意味着数组可以存储 `Person` 类的对象。
2. **数组长度**:数组的长度被指定为5,这意味着数组可以存储5个 `Person` 类型的对象。
3. **内存分配**:在堆内存中为这个数组分配了5个 `Person` 对象的内存空间。数组中的每个元素都是 `Person` 类型的引用变量,默认初始化为 `null`。
4. **初始化**:数组创建后,数组中的每个元素都默认初始化为 `null`。这意味着在数组创建时,数组中并没有实际的 `Person` 对象,只有存储对象的内存空间。
5. **可变性**:数组的大小在创建后是固定的,无法改变。这意味着一旦创建了数组,就不能再增加或减少数组的大小。
6. **多态性**:由于 `Student` 和 `Teacher` 类继承自 `Person` 类,你可以将 `Student` 或 `Teacher` 类的对象赋值给 `Person` 类型的数组。这是因为 `Student` 和 `Teacher` 类的对象在运行时可以被视为 `Person` 类的对象。
7. **动态绑定**:当你调用数组中某个元素的 `say` 方法时,实际上会调用该元素所引用对象的 `say` 方法。这体现了多态性的动态绑定特性,即调用哪个方法取决于运行时对象的类型。
总结来说,`Person[] persons = new Person[5];` 语句创建了一个可以存储5个 `Person` 对象引用的数组,每个元素默认初始化为 `null`。这个数组可以存储 `Person`、`Student` 或 `Teacher` 类的对象,并且能够体现多态性的动态绑定特性。

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

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

相关文章

基于51单片机的MQ-2烟雾报警设计

随着现代家庭用火、用电量的增加,家庭烟雾发生的频率越来越高。烟雾报警器也随之被广泛应用于各种场合。本课题所研究的无线多功能烟雾报警器采用STC89C51为核心控制器,利用气体传感器MQ-2、ADC0832模数转换器、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片,当环…

前端技术回顾系列 08|TS 泛型基础

在微信中阅读,关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对你有帮助,请不要忘了 点赞、分享 和 关注 我的公众号:CodeFit,为我的持续创作提供一些动力。 上篇内容回顾:枚举(Enums) 在上篇文章中,我们详细回顾了 TypeScript 中的 枚举(Enums)。 枚举 是一…

设置路径别名

一、描述 如果想要给路径设置为别名&#xff0c;就是常见的有些项目前面的引入文件通过开头的&#xff0c;也就是替换了一些固定的文件路径&#xff0c;怎么配置。 二、配置 import { defineConfig } from vite import react from vitejs/plugin-react import path from path…

ElementUi el-tree动态加载节点数据 load方法触发机制

需求背景&#xff1a;需要根据点击后获取的数据动态渲染一个 el-tree&#xff0c;同时渲染出来的 el-tree&#xff0c;需要点击节点时才能获取该节点的层数的获取&#xff0c;如图所示&#xff0c;我需要点击“组”节点才能渲染“设备列表”树&#xff0c;同时“设备列表”树的…

war后门文件部署 什么是war后门文件 为什么要部署???看见war后门文件部署你知道????

在漏洞复现的时候做了一道war后门文件部署的&#xff0c;然后我们就要去了解什么是war包&#xff0c;然后这个漏洞实现要有什么情况&#xff1f;&#xff1f;为什么要进行部署&#xff1f;&#xff1f; war包在哪些地方可以实现&#xff1f;&#xff1f;&#xff1f; war是一种…

优设AI导航

1、优设AI导航 优设AI导航

数据结构与算法题目集(中文)6-2顺序表操作集

题目地址 https://pintia.cn/problem-sets/15/exam/problems/type/6?problemSetProblemId725&page0 注意审题&#xff0c;返回false的时候不要返回ERROR&#xff0c;否则答案错误&#xff0c;机器规则是死的。 位置一般指数组下标&#xff0c;位序一般指数组下标1。但是思…

[FreeRTOS 基础知识] 任务调度 与 链表

文章目录 任务并行的概念RTOS如何实现多任务调度&#xff1f; 任务并行的概念 在生活中&#xff0c;经常出现一心多用的情况。比如你需要一边吃饭一边手机回复信息&#xff0c;这里面就存在两个任务&#xff1a;任务一、吃饭。任务二、手机回复信息。 假如你无法一心多用&…

前端技术入门指南

引言 在数字化时代&#xff0c;前端开发成为了连接用户与数字世界的重要桥梁。无论你是对编程充满好奇的新手&#xff0c;还是想要拓展自己技能领域的在职人员&#xff0c;前端开发都是一个值得学习和探索的领域。本文将带你走进前端技术的世界&#xff0c;为你提供一个入门指…

【Modelground】个人AI产品MVP迭代平台(5)——神投手(实时投篮检测游戏)

文章目录 介绍篮框识别进球算法离屏渲染总结 介绍 神投手是我开发的一款移动端web实时投篮检测游戏。其解决的痛点是&#xff1a;专为投篮训练而生的&#xff0c;有手机就能玩的投篮计数游戏。我本人是一个篮球爱好者&#xff0c;特点就是投篮准&#xff0c;虽然投篮挺靠天赋&…

DevExpress WPF中文教程:Grid - 如何向项目添加GridControl并绑定到数据

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

第十二届蓝桥杯单片机国赛练习代码

文章目录 前言一、问题重述二、主函数总结 前言 第十五蓝桥杯国赛落幕已有十天&#xff0c;是时候总结一下&#xff0c;这个专栏也将结束。虽然并没有取得预期的结果&#xff0c;但故事结尾并不总是美满的。下面是赛前练习的第十二届国赛的代码。 一、问题重述 二、主函数 完整…

大数据快速使用Kerberos认证集群

一、创建安全集群并登录其Manager 创建安全集群&#xff0c;开启“Kerberos认证“参数开关&#xff0c;并配置“密码“、“确认密码“参数。该密码用于登录Manager&#xff0c;请妥善保管。 登录MRS管理控制台页面。 单击“集群列表“&#xff0c;在“现有集群“列表&#xf…

虚拟机调用摄像头设备一直 select timeout问题的解决

在VMware里面调用v4l2-ctl捕获图像&#xff0c;或者opencv的VideoCapture(0)捕获图像&#xff0c;或者直接调用v4l2的函数&#xff0c;在streamon后&#xff0c;调用select读取数据&#xff0c;均会一直提示select timeout的问题&#xff0c;大概率是由于USB版本的兼容性造成的…

fs.1.10 ON rockylinux8 docker镜像制作

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 rockylinux docker上编译安装fs1.10版本的流程记录。 环境 docker engine&#xff1a;Version 24.0.6 rockylinux docker&#xff1a;8 freeswitch&#xff1a;v1.10.7 手动模式 rockylinux准备 docker hub拉取r…

AI智能体做高考志愿填报分析

关注公众号&#xff0c;赠送AI/Python/Linux资料&#xff0c;对AI智能体有兴趣的朋友也可以添加一起交流 高考正在进行时&#xff0c;学生焦虑考试&#xff0c;家长们焦虑的则是高考志愿怎么填。毕竟一个好的学校&#xff0c;好的专业是进入社会的第一个敲门砖 你看张雪峰老师…

2024.6.10学习记录

1、代码随想录二刷 2、项目难点 review 3、计组复习

RabbitMQ-工作模式(Topics模式RPC模式Publisher Confirms模式)

文章目录 Topics模式topic代码示例 RPC模式客户端界面回调队列关联ID总结RPC代码示例 Publisher Confirms模式概述在通道上启用发布者确认单独发布消息批量发布消息异步处理发布者确认总结总体代码示例 更多相关内容可查看 Topics模式 在Topics中&#xff0c;发送的消息不能具…

目标检测算法YOLOv9简介

YOLOv9由Chien-Yao Wang等人于2024年提出&#xff0c;论文名为&#xff1a;《YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/2402.13616 &#xff1b;源码见: https://github.com/W…

一文带你轻松掌握Java数组定义和声明

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…