一、实验目的
1.理解多态性和动态绑定
2.存储、提取和操作ArrayList中的对象

二、实验内容
1.【Person、Student、Employee类】(注:此题在书上原题基础上有修改)设计一个名为Person的类和它的两个名为Student和Employee子类。

每个人都有姓名和电话号码。学生有年级状态(大一、大二、大三或大四)。将这些状态定义为常量。一个雇员有工资和受聘日期。定义一个名为MyDate的类,包含数据域:year(年)、month(月)和day(日)。将各个类的数据域进行封装,并设置合理的读写访问器。
覆盖每个类中的toString方法,返回类名及相应的类中可以获取的所有信息构成的字符串,如Person类的toString方法返回“Person类:姓名为*** 电话为*** ”;Student类的toString方法返回“Student类: 姓名为*** 电话为*** 年级为***”。

在Student和Employee两个类中分别加入displayObject()方法,可以打印出对学生和雇员的提示消息,提示学生“to ***(学生姓名):请按时交实验报告”,提示雇员“ to ***(雇员姓名):请按时上班”。

目标输出任务:
画出这些类的UML图。
实现这些类。
编写一个测试类,1)创建方法public static void m1(Person p),显示p的姓名;2)创建方法public static void m2(Person p),打印p的toString方法返回的字符串;3)创建方法public static void m3(Person p),如果p是Student类或者Employee类的实例,分别调用它们的displayObject();4)在主函数中创建Person、Student、Employee的对象实例,将它们均声明为Person类对象。将它们分别传入m1、m2和m3,体会多态。

2. 【课程类Course】改写程序清单10-6中的Course类。 使用ArrayList代替数组来存储学生。不应该改变Course类的原始合约(即不要改变构造方法和方法的方法头定义,包括返回类型、方法名及参数列表,但私有的成员可以改变)。

程序清单10-6
public class Course {private String courseName;private String[] students = new String[100];private int numberOfStudents;public Course(String courseName) {this.courseName = courseName;}public void addStudent(String student) {students[numberOfStudents] = student;numberOfStudents++;}public String[] getStudents() {return students;}public int getNumberOfStudents() {return numberOfStudents;}  public String getCourseName() {return courseName;}  public void dropStudent(String student) {// Left as an exercise in Exercise 9.9}
}
程序清单10-5
【注意:请参考以下程序来测试Course类,同时注意在此段程序基础上,增加必要的代码,以完整地测试Course类中定义的所有方法】
public class TestCourse {public static void main(String[] args) {Course course1 = new Course("Data Structures");Course course2 = new Course("Database Systems");course1.addStudent("Peter Jones");course1.addStudent("Brian Smith");course1.addStudent("Anne Kennedy");course2.addStudent("Peter Jones");course2.addStudent("Steve Smith");System.out.println("Number of students in course1: "+ course1.getNumberOfStudents());String[] students = course1.getStudents();for (int i = 0; i < course1.getNumberOfStudents(); i++)System.out.print(students[i] + ", ");System.out.println();System.out.print("Number of students in course2: "+ course2.getNumberOfStudents());}
}

3. 附加题(可选做)(利用继承实现MyStack)在程序清单11-10中,MyStack是用组合实现的。扩展ArrayList创建一个新的栈类。实现MyStack类。编写一个测试程序,提示用户输入5个字符串,然后以逆序显示这些字符串。

三、实验要求:
要求每个学生独立完成实验任务。

四、实验报告
1. 实验结果与分析
(1) Person、Student、Employee类
A) UML类图

B) 实验运行过程

C) 结果分析
本题分成五个类:
Person类中含最起初name和telenum的属性,设置其get和set方法,定义toString函数;
Student类继承Person类,同时加入Grade属性,设置其get和set方法,定义toString函数和displayObject函数;
Employee类继承Person类,同时加入salary和MyDate类型的date属性,设置其get和set方法,定义toString函数和displayObject函数;
MyDate类是date的类型定义,其中包括year,month,day属性,设置其get和set方法,在有参构造方法中设置属性的值(利于主函数的参数设置);
Test类是主函数的定义类,其中首先定义年级信息的常量,便于主函数的引用,然后定义m1,m2,m3函数,其中m3函数需要判断实例类型,需要使用强制转换才能调用Student类或Employee类中的displayObject方法,判断实例类型时选择使用instanceof关键词。
主函数中首先定义三个不同类型的实例,并引用给都是Person类型的变量,然后定义其name和telenum,其中Student实例需要强制转换后定义其Grade值,Employee实例需要强制转换后定义其salary值和date值,date是一个新创建的MyDate类型的对象。
接着调用三个实例的m1,m2,m3方法即可输出结果。

(2)Course类
A) UML类图

B) 实验运行过程

C) 实验结果分析
本题只要求将数组相关语句换成我们需要的ArrayList语句即可
因此我们可以直接将语句替换

public class Course {private String courseName;private String[] students = new String[100];
//这里更换成
private ArrayList<String> students = new ArrayList<String>(100);private int numberOfStudents;public Course(String courseName) {this.courseName = courseName;}public void addStudent(String student) {students[numberOfStudents] = student;
//这里更换成
students.add(numberOfStudents,student);
其中add(index,o)方法定义是在index下标确定的位置加入o元素numberOfStudents++;}public String[] getStudents() {//这里更换成
public ArrayList<String> getStudents() {return students;}public int getNumberOfStudents() {return numberOfStudents;}  public String getCourseName() {return courseName;}  public void dropStudent(String student) {// Left as an exercise in Exercise 9.9}
}
【注意:请参考以下程序来测试Course类,同时注意在此段程序基础上,增加必要的代码,以完整地测试Course类中定义的所有方法】
public class TestCourse {public static void main(String[] args) {Course course1 = new Course("Data Structures");Course course2 = new Course("Database Systems");course1.addStudent("Peter Jones");course1.addStudent("Brian Smith");course1.addStudent("Anne Kennedy");course2.addStudent("Peter Jones");course2.addStudent("Steve Smith");System.out.println("Number of students in course1: "+ course1.getNumberOfStudents());
String[] students = course1.getStudents();
//这里更换成ArrayList<String>students = course1.getStudents();for (int i = 0; i < course1.getNumberOfStudents(); i++)System.out.print(students[i] + ", ");
//这里更换成
students.get(i)
其中get(index)方法返回index下表位置的元素System.out.println();System.out.print("Number of students in course2: "+ course2.getNumberOfStudents());}
}

(3)MyStack类
A) UML类图

B) 实验运行过程
首先根据提示输入元素个数

再根据提示输入该个数个元素

回车,返回逆序结果

C) 实验结果分析
首先我们分析MyStack和泛类ArrayList的不同:
MyStack需要在栈尾插入,栈尾删除,而ArrayList可以在任意确定位置下进行这样的操作;
调用F3我们可以找到ArrayList类的一些定义

这样就可以想到:我们可以利用ArrayList中已有的add(无参)函数和remove(有参)方法来改写定义,其中add不动,换成push头名,remove的参数设置成this.size()-1来每次删除末尾元素并保存到变量中,这样就实现了本题中必要的入栈出栈操作。
在主函数中,我们首先输入元素个数,再根据元素个数确定循环次数,输入元素,入栈,再循环相同次出栈输出即可

2. 心得体会
本次是练习新学的多态和动态绑定知识点,并对ArrayList列表了解,尤其是第一道题,在进行相关的建构时对MyDate类的实例创建遇到了难处,在一遍遍研究中通过之后,我感觉自己对动态绑定在多态中的理解有了十分显著的提高;而在第二题和第三题过程中对继承相关的应用也进行了巩固
本次实验就我自身而言是不简单的一次,但不简单也代表着有了新的挑战,希望之后的实验能对Java的应用有更显著的提高。

3.源程序

(1)
Person.java
package exp5;public class Person {private String name;private String telenum;public String getName(){return this.name;}public String getTeleNum(){return this.telenum;}public void setName(String name){this.name = name;}public void setTeleNum(String telenum){this.telenum = telenum;}@Overridepublic String toString() {return "Person类:姓名为" + this.getName() + " " + "电话为:" + this.getTeleNum();}
}
Student.java
package exp5;public class Student extends Person{private String Grade;public String getGrade(){return Grade;}public void setGrade(String Grade){this.Grade = Grade;}@Overridepublic String toString() {return "Student类:姓名为" + this.getName() + " " + "电话为:" + this.getTeleNum() + " 年级为:" + this.getGrade();}public String displayObject(){return "to " + this.getName() + ": 请按时交实验报告";}
}
Employee.java
package exp5;import java.sql.Date;public class Employee extends Person{private int salary;private MyDate date;public int getSalary(){return salary;}public void setSalary(int salary){this.salary = salary;}public String getDate(){return date.getYear() + "," + date.getMonth() + "," + date.getDay();}public void setDate(MyDate date){this.date = date;}@Overridepublic String toString() {return "Employee类:姓名为" + this.getName() + " " + "电话为:" + this.getTeleNum() + " 工资为:" + this.getSalary() + " 受聘日期为:" + this.date.getDate() ; }public String displayObject(){return "to " + this.getName() + ": 请按时上班";}
}
MyDate.java
package exp5;public class MyDate {public MyDate(String year,String month,String day){this.year = year;this.month = month;this.day = day;}private String year;private String month;private String day;public String getYear() {return year;}public String getMonth() {return month;}public String getDay() {return day;}public void setYear(String year) {this.year = year;}public void setMonth(String month) {this.month = month;}public void setDay(String day) {this.day = day;}public String getDate(){return this.year + this.month + this.day;}
}
Test.java
package exp5;public class Test {static final String GradeOne = "One";static final String GradeTwo = "Two";static final String GradeThree = "Three";static final String GradeFour = "Four";public static void m1(Person p){System.out.println(p.getName());}public static void m2(Person p){System.out.println(p.toString());}public static void m3(Person p){if(p instanceof Student){System.out.println(((Student)p).displayObject());}else if(p instanceof Employee){System.out.println(((Employee)p).displayObject());}else {System.out.println("请求有误,请重新尝试!");}}public static void main(String[] args) {Person aPerson = new Person();aPerson.setName("a");aPerson.setTeleNum("12345");Person bStudent = new Student();bStudent.setName("b");bStudent.setTeleNum("67890");((Student)bStudent).setGrade(GradeOne);Person cEmployee = new Employee();cEmployee.setName("c");cEmployee.setTeleNum("13579");((Employee) cEmployee).setSalary(15000);Employee employee = new Employee();MyDate date = new MyDate("2011","09","05");((Employee) cEmployee).setDate(date);m1(aPerson);m1(bStudent);m1(cEmployee);m2(aPerson);m2(bStudent);m2(cEmployee);m3(aPerson);m3(bStudent);m3(cEmployee);}
}
(2)
Course.java
package exp5;import java.util.ArrayList;public class Course {private String courseName;private ArrayList<String> students = new ArrayList<String>(100);private int numberOfStudents;public Course(String courseName) {this.courseName = courseName;}public void addStudent(String student) {students.add(numberOfStudents,student);numberOfStudents++;}public ArrayList<String> getStudents() {return students;}public int getNumberOfStudents() {return numberOfStudents;}  public String getCourseName() {return courseName;}
}
TestCourse.java
package exp5;import java.util.ArrayList;public class TestCourse {public static void main(String[] args) {Course course1 = new Course("Data Structures");Course course2 = new Course("Database Systems");course1.addStudent("Peter Jones");course1.addStudent("Brian Smith");course1.addStudent("Anne Kennedy");course2.addStudent("Peter Jones");course2.addStudent("Steve Smith");System.out.println("Number of students in course1: "+ course1.getNumberOfStudents());ArrayList<String>students = course1.getStudents();for (int i = 0; i < course1.getNumberOfStudents(); i++)System.out.print(students.get(i) + ", ");System.out.println();System.out.print("Number of students in course2: "+ course2.getNumberOfStudents());}}
(3)
MyStack.javapackage exp5;import java.util.ArrayList;
import java.util.Scanner;public class MyStack extends ArrayList{public void push(Object o){this.add(o);}public Object pop(){Object o = this.get(this.size() - 1);this.remove(this.size() - 1);return o;}public static void main(String[] args) {Scanner input = new Scanner(System.in);int num;System.out.println("请输入元素的个数");num = input.nextInt();System.out.println("请输入元素: ");MyStack myStack = new MyStack();for(int i = 0; i < num;i++){myStack.push(input.next());}for(int i = 0; i < num;i++){System.out.println(myStack.pop());}}
}

Java课程实验报告实验五——面向对象—多态相关推荐

  1. java实验报告4继承与多态_Java继承与多态实验报告

    西 西 安 安 邮 邮 电 大 学 (计算机学院) 课内实验报告 实验名称: : 态 继承与多态 ﻩ ﻩ 专业名称: 计算机科学与技术 班 班 级: 计科 1405 班 学生姓名: 高宏伟 学 学 号 ...

  2. java程序设计教程实验报告_java程序设计课程--实验报告-实验13.doc

    java程序设计课程--实验报告-实验13.doc 还剩 12页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: ...

  3. java继承和多态的实验报告_Java继承与多态实验报告.doc

    Java继承与多态实验报告 西 安 邮 电 大 学 (计算机学院) 课内实验报告 实验名称: 继承与多态 专业名称: 计算机科学与技术 班 级: 计科1405班 学生姓名: 高宏伟 学 号: 指导教师 ...

  4. Java实验报告实验4

    Java实验报告实验4 课程名称: 面向对象程序设计 实验类型: 设计型 实验项目名称: 综合设计 实验地点: 实验日期: 2021 年 月 日 成绩: 一.实验目的及要求 掌握Java GUI图形用 ...

  5. html表单实验结论,web前端开发技术实验报告-实验五

    1.长 春 大 学 20 15 2016学年第 二 学期Web前端开发技术 课程实 验 报 告学 院: 计算机科学技术专 业: 软件工程 班 级: 软件14402 学 号: 姓 名: 王 悦 任课教师 ...

  6. 计算机网络课程设计综合实验,计算机网络课程设计报告实验报告

    计算机网络课程设计报告实验报告 (21页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 24.9 积分 中南大学课程设计报告课程:计算机网络课程设计 题目: ...

  7. 0145129实验报告(五)

    20145129实验报告(五) 实验目的 TCP方式进行网络通讯,实现服务器与客户端. 客户端与服务器连接,并实现数据交互. 实验内容 (一)实现服务器 本次试验,小组中我做服务器. 我将加密算法新建 ...

  8. 武汉科技大学java题库答案_武汉科技大学 java实验报告 实验二

    <武汉科技大学 java实验报告 实验二>由会员分享,可在线阅读,更多相关<武汉科技大学 java实验报告 实验二(9页珍藏版)>请在金锄头文库上搜索. 1.注:"实 ...

  9. Web前端开发技术课程实验报告实验3:Vue路由实验

    实验代码:实验3第2题实验参考.rar-互联网文档类资源-CSDN下载 Web前端开发技术课程实验报告 实验3:Vue路由实验 姓名:_ __ _ ___ ___   班级:_ _ _ ___ _ _ ...

  10. 武汉科技大学java题库答案_武汉科技大学java实验报告实验二.doc

    武汉科技大学java实验报告实验二.doc 注"实验记录及个人小结"部分不够可另附页或在背面续写第页信息科学与工程学院JAVA程序设计上机实验报告专业班级姓名学号实验时间指导教师成 ...

最新文章

  1. MOS管体二极管的作用
  2. 深度学习(二十)基于Overfeat的物体检测-2014 ICLR-未完待续
  3. 解决uni-app中flex布局子元素宽度溢出
  4. 一个java类运行时从哪个方法开始_Java的应用程序是从类中的
  5. 【Pytorch神经网络实战案例】12 利用注意力机制的神经网络实现对FashionMNIST数据集图片的分类
  6. mount nfs 经常出错信息总结(转)
  7. java 生成二维码,并跟其他图合成新图 图片添加水印
  8. HDOJ 5184 Brackets 卡特兰数扩展
  9. Tableau可视化学习笔记:day03-04
  10. Android Multimedia框架总结(四)MediaPlayer从Java层到C++层类关系及prepare及之后其他过...
  11. Microsoft Visio 软件的使用
  12. VueUse中文文档Vue官方工具库
  13. oracle 不带时分秒,关于Oracle数据库不带日期中时分秒的查询
  14. 产品经理和软件工程师的职能划分
  15. Arm汇编寻址方式工作模式
  16. python pyecharts用法_pyecharts的简单使用
  17. 解放双手——Android自动化测试
  18. 小议智能的测试与评价
  19. 工业镜头选型,CCD芯片尺寸表,像素毫米转换方式
  20. 在vmware/virtualBox 虚拟机中使用adsl拨号上网

热门文章

  1. 食品企业如何做好网络营销?
  2. 数字后端A7core项目记录1.1SDC文件、MMMC文件和lef文件
  3. android ndc,2.3.2 CommandListener构造函数和测试工具ndc
  4. Sergey's problem CF1019C
  5. 【毕业设计】java基于微信小程序高校闲置物品交易平台小程序 闲置物品交易微信小程序 闲置物品交易小程序
  6. 微信小程序npm步骤
  7. 2022年升降机司机考试资料及升降机司机证考试软件
  8. 麦克表单可以做二维码吗_共享充电宝可以做吗?
  9. FOXBORO FBM232 P0926GW 伺服驱动模块
  10. 丁海森: 域名投资无须营业执照,小生意,大买卖?