中南大学计算机学院实验报告
课程名称 Java面向对象程序设计SSD3
实验项目名称 实验5《面向对象——多态》
学生姓名 Xi_Chen123 专业班级 ******班 学号 **********
实验成绩 日期
实验学时: 2
每组人数: 1
实验类型: 1 (1:基础性 2:综合性 3:设计性 4:研究性)
实验要求: 1 (1:必修 2:选修 3:其它)
实验类别: 2 (1:基础 2:专业基础 3:专业 4:其它)
- 实验目的
- 理解多态性和动态绑定
- 存储、提取和操作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. (P380, 11.5)【课程类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) { } } |
程序清单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.(P381, 11.10)(利用继承实现MyStack)在程序清单11-10中,MyStack是用组合实现的。扩展ArrayList创建一个新的栈类。实现MyStack类。编写一个测试程序,提示用户输入5个字符串,然后以逆序显示这些字符串。
要求每个学生独立完成实验任务。
四、实验报告
1.在一周内完成本项目实验,在可视化平台上提交实验文档,包括:.java文件(分别对应以上3道题,不需要.class文件)打包成一个名为“实验5”的.rar或.zip文件,以及实验报告1份(格式与要求见下),报告命名为“班级名(如“2101”)_学号_姓名_实验5.doc”。
2. 实验结果与分析
(包括UML图、运行结果截图等)
实验一:
实验二:
实验三:
3. 心得体会
(记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。)
在实验一的编写过程中,需要的类的数目较多,关系也略有复杂,因此花费了一些时间整理类与类之间的关系。Student和Employee类继承自Person类,在Employee类中还有一个MyData类的私有数据域需要声明,再加上Demo类,因此总共需要五个类,之间的相关关系需要理清。
在实验二的编写过程中,首先需要理解工具类ArrayList类中的常用API的使用格式和作用,如:add()/get()/remove()等。其次,根据题目要求,我们在修改Course类的时候需要保持类中的原始合约和修改前相同,这样在修改类之后可以保证在过去使用了该接口的相关程序中继续正常运行。
为了保持接口一致,在getStudents()的方法中,需要创建一个String类型的数组并通过for循环保存ArrayList中的数据,最后返回该数组,就可以达到保持类中原始合约的效果了。
在编写实验三的过程中,还遇到了数组索引越界的问题。其原因是在删除学生的过程中,Course类中的numberOfStudents元素没有进行自增自减的操作,导致数据出错,在今后的程序设计中需要注意这样的错误
exercise1
exercise1Demo
package com.xc5.exercise1;
import javax.xml.crypto.Data;
public class exercise1Demo {
public static void main(String[] args) {
//创建对象
Person person=new Person("张三",110);
Person xiaoMing=new Student("小明",120,"大二");
MyData d=new MyData(2022,5,1);
Person laoWang=new Employee("老王",119,3200.5,d);
//输出界面
m1(person);
m1(xiaoMing);
m1(laoWang);
m2(person);
m2(xiaoMing);
m2(laoWang);
m3(person);
m3(xiaoMing);
m3(laoWang);
}
//显示p的姓名
public static void m1(Person p){
System.out.println(p.getName());
}
//打印p的toString方法返回的字符串
public static void m2(Person p){
System.out.println(p.toString());
}
//如果p是Student或Employee类的实例,则调用他们的displayObject()
public static void m3(Person p){
if(p instanceof Student){
((Student) p).displayObject();
}
if(p instanceof Employee){
((Employee) p).displayObject();
}
}
}
Emolpyee
package com.xc5.exercise1;
public class Employee extends Person{
private double salary;
private MyData data;
public Employee() {
}
public Employee(String name, long phoneNumber, double salary, MyData data) {
super(name, phoneNumber);
this.salary = salary;
this.data = data;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public MyData getData() {
return data;
}
public void setData(MyData data) {
this.data = data;
}
@Override
public String toString() {
return "Employee类:姓名为"+getName()+" 电话为"+getPhoneNumber()+" 工资为"+getSalary()+" 入职日期为"+getData();
}
public void displayObject(){
System.out.println("to "+getName()+" : 请按时上班");
}
}
MyData
package com.xc5.exercise1;
public class MyData {
private int year;
private int mouth;
private int day;
public MyData() {
}
public MyData(int year, int mouth, int day) {
this.year = year;
this.mouth = mouth;
this.day = day;
}
public int getYear() {
return year;
}
public int getMouth() {
return mouth;
}
public int getDay() {
return day;
}
@Override
public String toString() {
return getYear()+"年"+getMouth()+"月"+getDay()+"日";
}
}
Person
package com.xc5.exercise1;
public class Person {
private String name;
private long phoneNumber;
public Person() {
}
public Person(String name, long phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(long phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public String toString(){
return "Person类:姓名为"+getName()+" 电话为"+getPhoneNumber();
}
}
Student
package com.xc5.exercise1;
public class Student extends Person{
private String grade;
public Student() {
}
public Student(String name, long phoneNumber, String grade) {
super(name, phoneNumber);
this.grade = grade;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String toString(){
return "Student类:姓名为"+getName()+" 电话为"+getPhoneNumber()+" 年级为"+getGrade();
}
public void displayObject(){
System.out.println("to "+getName()+" : 请按时交实验报告");
}
}
exercise2
Course
package com.xc5.exercise2;
import java.util.ArrayList;
public class Course {
private String courseName;
private ArrayList<String> students=new ArrayList<>();
private int numberOfStudents;
public Course(){
}
public Course(String courseName){
this.courseName=courseName;
}
public void addStudent(String students){
this.students.add(students);
numberOfStudents++;
}
public String[] getStudents() {
String[] students=new String[numberOfStudents];
for(int i=0;i<numberOfStudents;i++){
students[i]=this.students.get(i);
}
return students;
}
public int getNumberOfStudents() {
return numberOfStudents;
}
public String getCourseName() {
return courseName;
}
public void dropStudent(String students){
for(int i=0;i<numberOfStudents++;i++){
if(students==this.students.get(i)){
this.students.remove(i);
}
}
numberOfStudents--;
}
}
TestCourse
package com.xc5.exercise2;
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.getCourseName()+": " + course1.getNumberOfStudents());
String[] students = course1.getStudents();
for (int i = 0; i < course1.getNumberOfStudents(); i++)
System.out.print(students[i] + ", ");
System.out.println();
System.out.println("删除学生前");
System.out.print("Number of students in course2"+course2.getCourseName()+": " + course2.getNumberOfStudents());
String[] students2=course2.getStudents();
for(int i=0;i<course2.getNumberOfStudents();i++){
System.out.print(students2[i]+", ");
}
course2.dropStudent("Steve Smith");
System.out.println();
System.out.println("删除学生后");
System.out.print("Number of students in course2"+course2.getCourseName()+": " + course2.getNumberOfStudents());
students2=course2.getStudents();
for(int i=0;i<course2.getNumberOfStudents();i++){
System.out.print(students2[i]+", ");
}
}
}
exercise1
MyStack
package com.xc5.exercise3;
public class MyStack extends java.util.ArrayList {
public boolean isEmpty() {
return this.isEmpty();
}
public int getSize() {
return this.size();
}
public Object peek() {
return this.get(getSize() - 1);
}
public Object pop() {
Object object = this.get(this.size() - 1);
this.remove(this.size() - 1);
return object;
}
public void push(Object object) {
this.add(object);
}
@Override
public String toString() {
return "Stack:\n"+"isEmpty: "+isEmpty()+"\nsize: "+getSize();
}
}
MyStackDemo
package com.xc5.exercise3;
import java.util.Scanner;
public class MyStackDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入5个元素:");
MyStack myStack = new MyStack();
for(int i = 0; i < 5; i++){
myStack.push(sc.next());
}
System.out.println("逆序显示:");
for(int i = 0; i < 5; i++){
System.out.print(myStack.pop());
System.out.print(" ");
}
}
}