一 、实验目的
- 理解多态性和动态绑定
- 存储、提取和操作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,体会多态。
1.1该实验的UML图如下:
1.2运行结果及其分析
测试结果一:
测试结果二:
分析:由测试结果可知,该程序完全符合实验要求。
1.3心得体会
通过这个实现,重温了继承与组合的关系,对画UML更加的熟练了。最重要的是深刻的体会到了多态的运行机制。
1.4该实验的源代码如下
Person类:
- class Person {
- private String name ;
- private String telnum;
- public Person() {
- }
- public Person(String name, String telnum) {
- this.name = name;
- this.telnum = telnum;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getTelnum() {
- return telnum;
- }
- public void setTelnum(String telnum) {
- this.telnum = telnum;
- }
- @Override
- public String toString() {
- return "Person{" +
- "name='" + name + '\'' +
- ", telnum='" + telnum + '\'' +
- '}';
- }
- }
Student类:
- class Student extends Person{
- private String grade;
- public final static String GRADE1 = "大一";
- public final static String GRADE2 = "大二";
- public final static String GRADE3 = "大三";
- public final static String GRADE4 = "大四";
- public Student() {
- }
- public Student(String grade) {
- this.grade = grade;
- }
- public Student(String name, String telnum, String grade) {
- super(name,telnum);
- this.grade = grade;
- }
- public void displayObject(){
- System.out.println("to "+getName()+":请按时交实验报告!");
- }
- @Override
- public String toString() {
- return "Student{" +
- "name='" + getName() + '\'' +
- ", telnum='" + getTelnum() + '\'' +
- ",grade='" + grade + '\'' +
- '}';
- }
- }
Emplyee类:
- class Employee extends Person{
- private MyDate date;
- private String salary;
- public Employee(String name, String telnum, MyDate date, String salary) {
- super(name, telnum);
- this.date = date;
- this.salary = salary;
- }
- public Employee() {
- }
- public void displayObject(){
- System.out.println("to "+getName()+":请按时上班!");
- }
- @Override
- public String toString() {
- return "Employee{" +
- "" + date +
- ", salary='" + salary + '\'' +
- '}';
- }
- public MyDate getDate() {
- return date;
- }
- public void setDate(MyDate date) {
- this.date = date;
- }
- public String getSalary() {
- return salary;
- }
- public void setSalary(String salary) {
- this.salary = salary;
- }
- }
Mydate类:
- public class MyDate {//组合关系
- private String year;
- private String month;
- private String day;
- /*
- */
- public MyDate(String year, String month, String day) {
- this.year = year;
- this.month = month;
- this.day = day;
- }
- @Override
- public String toString() {
- return "入职日期{" +
- "year='" + year + '\'' +
- ", month='" + month + '\'' +
- ", day='" + day + '\'' +
- '}';
- }
- public MyDate() {
- }
- public String getYear() {
- return year;
- }
- public void setYear(String year) {
- this.year = year;
- }
- public String getMonth() {
- return month;
- }
- public void setMonth(String month) {
- this.month = month;
- }
- public String getDay() {
- return day;
- }
- public void setDay(String day) {
- this.day = day;
- }
- }
测试程序Demo类:
- public class Demo1 {
- 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)
- ((Student) p).displayObject();
- else if (p instanceof Employee)
- ((Employee) p).displayObject();
- else if(p instanceof Person)
- System.out.println("This is persson");
- }
- public static void main(String[] args) {
- Person person = new Person("Per A","15689556565");
- Person student = new Student("stu A","17873154634",Student.GRADE1);
- Person employee = new Employee("emplyee A","15182092612",new MyDate("2020","6","1"),"13140");
- System.out.println("对于函数m1输出结果分别如下:");
- System.out.print("person : " );m1(person);
- System.out.print("student : ");m1(student);
- System.out.print("emplyee :");m1(employee);
- System.out.println();
- System.out.println("对函数m2输出结果分别如下:");
- System.out.print("person : " );m2(person);
- System.out.print("student : ");m2(student);
- System.out.print("emplyee :");m2(employee);
- System.out.println();
- System.out.println("对函数m3输出结果分别如下:");
- System.out.print("person : " );m3(person);
- System.out.print("student : ");m3(student);
- System.out.print("emplyee :");m3(employee);
- }
- }
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) { // Left as an exercise in Exercise 9.9 } } |
程序清单10-5 【注意:请参考以下程序来测试Course类,同时注意在此段程序基础上,增加必要的代码,以完整地测试Course类中定义的所有方法】
|
2.1实验结果及其分析:
应实验要求,改写测试程序得到的的测试结果如下:
分析:由测试结果可知,所有函数正常运转,该程序完全符合实验要求。
2.2心得体会
Java近几年来成为最受欢迎的编程语言也是有道理的,Java含有各种十分丰富的库。这个列表相比数组也更加的方便,其中的各种方法也使得操作的实现更加的方便。
2.3源代码如下:
Course类:
- import java.util.ArrayList;
- public class Course {
- private String courseName;
- private ArrayList<String> students = new ArrayList<>();
- private int numberOfStudents;
- public Course(String courseName) {
- this.courseName = courseName;
- }
- public void addStudent(String student) {
- students.add(student);
- numberOfStudents++;
- }
- public ArrayList<String> getStudents() {
- return students;
- }
- public int getNumberOfStudents() {
- return students.size();
- }
- public String getCourseName() {
- return courseName;
- }
- public void dropStudent(String student) {
- students.remove(student);
- }
- }
TestCourse类:
- 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("The name of course1 is :"+course1.getCourseName());
- System.out.println("Number of students in course1: "
- + course1.getNumberOfStudents());
- ArrayList<String> students = course1.getStudents();
- System.out.print("And the student are :");
- for (int i = 0; i < course1.getNumberOfStudents(); i++)
- System.out.print(students.get(i) + ", ");
- System.out.println();
- System.out.println("Now the Peter Jones Dropped out of the course ");
- course1.dropStudent("Peter Jones");
- System.out.print("Then the rest of the students are :");
- for (int i = 0; i < course1.getNumberOfStudents(); i++)
- System.out.print(students.get(i) + ", ");
- System.out.println();
- System.out.println("And the number of students in course1 is: "
- + course1.getNumberOfStudents());
- System.out.println();
- System.out.println();
- System.out.println("The name of course1 is :"+course2.getCourseName());
- System.out.println("Number of students in course2: "
- + course2.getNumberOfStudents());
- ArrayList<String> students2 = course1.getStudents();
- System.out.print("And the student are :");
- for (int i = 0; i < course2.getNumberOfStudents(); i++)
- System.out.print(students2.get(i) + ", ");
- }
- }
3.(P381, 11.10)(利用继承实现MyStack)在程序清单11-10中,MyStack是用组合实现的。扩展ArrayList创建一个新的栈类。实现MyStack类。编写一个测试程序,提示用户输入5个字符串,然后以逆序显示这些字符串。
3.1运行结果及其分析
1)测试结果一:
2)测试结果二:
分析:由测试结果可知,该程序完全符合实验要求。
3.2心得体会
这个实验刚开始就有各种想法,也觉得比较好玩,比c++写的栈简单许多。但实现的时候还是有点下不去手的感觉。主要原因是不熟练,对于底层知识的掌握也不熟练。认真思考类之间的关系,最后得到正确结果。
3.3该实验的源代码如下
- package Lab5;
- /*3.(P381, 11.10)(利用继承实现MyStack)在程序清单11-10中,MyStack是用组合实现的。
- 扩展ArrayList创建一个新的栈类。实
- 现MyStack类。编写一个测试程序,提示用户输入5个字符串,然后以逆序显示这些字符串。
- */
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Scanner;
- public class MyStack extends java.util.ArrayList {
- @Override
- public String toString() {
- return "MyStack{"+super.toString()+"}";
- }
- public MyStack() {
- }
- public MyStack(int initialCapacity) {
- super(initialCapacity);
- }
- public boolean isEmpty(){//判断栈是否为空
- return super.isEmpty();
- }
- public int getSize(){//返回栈中元素个数
- return super.size();
- }
- public Object peek(){ //获得栈顶元素
- return get(super.size()-1);
- }
- public Object pop(){//返回并删除该栈的栈顶元素
- Object o = this.peek();
- super.remove(super.size()-1);
- return o;
- }
- public void push(Object o){//增加一个新的元素到栈顶
- super.add(o);
- }
- //测试程序
- public static void main(String[] args) {
- Scanner input = new Scanner(System.in);
- System.out.println("请输入五个字符串:");
- String s;
- MyStack stack = new MyStack();
- for(int i=0;i<5;i++)
- {
- s = input.next();
- stack.push(s);
- }
- System.out.println("用栈逆序输出得:");
- while (!stack.isEmpty()){
- System.out.print(stack.pop()+" ");
- }
- }
- }