JavaSSD3实验5《面向对象——多态》

本文深入探讨Java中多态性的应用,通过实现Person、Student、Employee类以及使用ArrayList存储对象,展示了动态绑定和多态性的核心概念。此外,还介绍了如何改写Course类以使用ArrayList代替数组存储学生信息,以及利用继承实现MyStack类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 、实验目的

  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,体会多态。

1.1该实验的UML图如下:

 

 

1.2运行结果及其分析

 

测试结果一:

测试结果二:

 

分析:由测试结果可知,该程序完全符合实验要求。

 

 

1.3心得体会

  通过这个实现,重温了继承与组合的关系,对画UML更加的熟练了。最重要的是深刻的体会到了多态的运行机制。

1.4该实验的源代码如下

 

Person类:

  1. class Person {  
  2.     private String name ;  
  3.     private String telnum;  
  4.   
  5.   
  6.     public Person() {  
  7.     }  
  8.   
  9.     public Person(String name, String telnum) {  
  10.         this.name = name;  
  11.         this.telnum = telnum;  
  12.     }  
  13.   
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.   
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.   
  22.     public String getTelnum() {  
  23.         return telnum;  
  24.     }  
  25.   
  26.     public void setTelnum(String telnum) {  
  27.         this.telnum = telnum;  
  28.     }  
  29.   
  30.     @Override  
  31.     public String toString() {  
  32.         return "Person{" +  
  33.                 "name='" + name + '\'' +  
  34.                 ", telnum='" + telnum + '\'' +  
  35.                 '}';  
  36.     }  
  37. }  

Student类:

  1. class Student extends Person{ 
  2.     private String grade;  
  3.     public final static String GRADE1 = "大一";  
  4.     public final static String GRADE2 = "大二";  
  5.     public final static String GRADE3 = "大三";  
  6.     public final static String GRADE4 = "大四";  
  7.   
  8.   
  9.     public Student() {  
  10.     }  
  11.   
  12.     public Student(String grade) {  
  13.         this.grade = grade;  
  14.     }  
  15.   
  16.     public Student(String name, String telnum, String grade) {  
  17.         super(name,telnum);  
  18.         this.grade = grade;  
  19.     }  
  20.   
  21.     public void displayObject(){  
  22.         System.out.println("to "+getName()+":请按时交实验报告!");  
  23.     }  
  24.     @Override  
  25.     public String toString() {  
  26.         return "Student{" +  
  27.                 "name='" + getName() + '\'' +  
  28.                 ", telnum='" + getTelnum() + '\'' +  
  29.                 ",grade='" + grade + '\'' +  
  30.                 '}';  
  31.     }  
  32. }  

Emplyee类:

  1. class Employee extends Person{  
  2.     private MyDate date;  
  3.     private String salary;  
  4.   
  5.     public Employee(String name, String telnum, MyDate date, String salary) {  
  6.         super(name, telnum);  
  7.         this.date = date;  
  8.         this.salary = salary;  
  9.     }  
  10.   
  11.     public Employee() {  
  12.     }  
  13.   
  14.     public void displayObject(){  
  15.         System.out.println("to "+getName()+":请按时上班!");  
  16.     }  
  17.   
  18.     @Override  
  19.     public String toString() {  
  20.         return "Employee{" +  
  21.                 "" + date +  
  22.                 ", salary='" + salary + '\'' +  
  23.                 '}';  
  24.     }  
  25.   
  26.     public MyDate getDate() {  
  27.         return date;  
  28.     }  
  29.   
  30.     public void setDate(MyDate date) {  
  31.         this.date = date;  
  32.     }  
  33.   
  34.     public String getSalary() {  
  35.         return salary;  
  36.     }  
  37.   
  38.     public void setSalary(String salary) {  
  39.         this.salary = salary;  
  40.     }  
  41. }  

Mydate类:

  1. public class MyDate {//组合关系  
  2.     private String year;  
  3.     private String month;  
  4.     private String day;  
  5. /* 
  6.  
  7.  */  
  8.     public MyDate(String year, String month, String day) {  
  9.         this.year = year;  
  10.         this.month = month;  
  11.         this.day = day;  
  12.     }  
  13.   
  14.     @Override  
  15.     public String toString() {  
  16.         return "入职日期{" +  
  17.                 "year='" + year + '\'' +  
  18.                 ", month='" + month + '\'' +  
  19.                 ", day='" + day + '\'' +  
  20.                 '}';  
  21.     }  
  22.   
  23.     public MyDate() {  
  24.     }  
  25.   
  26.     public String getYear() {  
  27.         return year;  
  28.     }  
  29.   
  30.     public void setYear(String year) {  
  31.         this.year = year;  
  32.     }  
  33.   
  34.     public String getMonth() {  
  35.         return month;  
  36.     }  
  37.   
  38.     public void setMonth(String month) {  
  39.         this.month = month;  
  40.     }  
  41.   
  42.     public String getDay() {  
  43.         return day;  
  44.     }  
  45.   
  46.     public void setDay(String day) {  
  47.         this.day = day;  
  48.     }  
  49. }  

测试程序Demo类:

  1. public class Demo1 {  
  2.     public static void m1(Person p){  
  3.         System.out.println(p.getName());  
  4.     }  
  5.     public static void m2(Person p){  
  6.         System.out.println(p.toString());  
  7.     }  
  8.     public static void m3(Person p){  
  9.     if (p instanceof Student)  
  10.         ((Student) p).displayObject();  
  11.     else if (p instanceof Employee)  
  12.         ((Employee) p).displayObject();  
  13.     else if(p instanceof  Person)  
  14.         System.out.println("This is persson");  
  15.     }  
  16.   
  17.     public static void main(String[] args) {  
  18.         Person person = new Person("Per A","15689556565");  
  19.         Person student = new Student("stu A","17873154634",Student.GRADE1);  
  20.         Person employee = new Employee("emplyee A","15182092612",new MyDate("2020","6","1"),"13140");  
  21.         System.out.println("对于函数m1输出结果分别如下:");  
  22.         System.out.print("person : " );m1(person);  
  23.         System.out.print("student : ");m1(student);  
  24.         System.out.print("emplyee :");m1(employee);  
  25.   
  26.         System.out.println();  
  27.         System.out.println("对函数m2输出结果分别如下:");  
  28.         System.out.print("person : " );m2(person);  
  29.         System.out.print("student : ");m2(student);  
  30.         System.out.print("emplyee :");m2(employee);  
  31.   
  32.         System.out.println();  
  33.         System.out.println("对函数m3输出结果分别如下:");  
  34.         System.out.print("person : " );m3(person);  
  35.         System.out.print("student : ");m3(student);  
  36.         System.out.print("emplyee :");m3(employee);  
  37.   
  38.   
  39.     }  
  40.   
  41. }  

 

 

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类中定义的所有方法】

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());
  }
}

 

 

 

 

 

2.1实验结果及其分析:

应实验要求,改写测试程序得到的的测试结果如下:

 

分析:由测试结果可知,所有函数正常运转,该程序完全符合实验要求。

2.2心得体会

   Java近几年来成为最受欢迎的编程语言也是有道理的,Java含有各种十分丰富的库。这个列表相比数组也更加的方便,其中的各种方法也使得操作的实现更加的方便。

 

2.3源代码如下:

Course类:

  1. import java.util.ArrayList;  
  2.   
  3. public class Course {  
  4.     private String courseName;  
  5.     private ArrayList<String> students = new ArrayList<>();  
  6.     private int numberOfStudents;  
  7.   
  8.     public Course(String courseName) {  
  9.         this.courseName = courseName;  
  10.     }  
  11.   
  12.     public void addStudent(String student) {  
  13.         students.add(student);  
  14.         numberOfStudents++;  
  15.     }  
  16.   
  17.     public ArrayList<String> getStudents() {  
  18.         return students;  
  19.     }  
  20.   
  21.     public int getNumberOfStudents() {  
  22.         return students.size();  
  23.     }  
  24.   
  25.     public String getCourseName() {  
  26.         return courseName;  
  27.     }  
  28.   
  29.     public void dropStudent(String student) {  
  30.         students.remove(student);  
  31.     }  
  32. }  

TestCourse:

  1. import java.util.ArrayList;  
  2. public class TestCourse {  
  3.     public static void main(String[] args) {  
  4.         Course course1 = new Course("Data Structures");  
  5.         Course course2 = new Course("Database Systems");  
  6.   
  7.         course1.addStudent("Peter Jones");  
  8.         course1.addStudent("Brian Smith");  
  9.         course1.addStudent("Anne Kennedy");  
  10.   
  11.         course2.addStudent("Peter Jones");  
  12.         course2.addStudent("Steve Smith");  
  13.   
  14.         System.out.println("The name of course1 is :"+course1.getCourseName());  
  15.         System.out.println("Number of students in course1: "  
  16.                 + course1.getNumberOfStudents());  
  17.         ArrayList<String> students = course1.getStudents();  
  18.         System.out.print("And the student are :");  
  19.         for (int i = 0; i < course1.getNumberOfStudents(); i++)  
  20.             System.out.print(students.get(i) + ", ");  
  21.         System.out.println();  
  22.         System.out.println("Now the Peter Jones Dropped out of the course ");  
  23.         course1.dropStudent("Peter Jones");  
  24.         System.out.print("Then the rest of the students are :");  
  25.         for (int i = 0; i < course1.getNumberOfStudents(); i++)  
  26.             System.out.print(students.get(i) + ", ");  
  27.         System.out.println();  
  28.         System.out.println("And the number of students in course1 is: "  
  29.                 + course1.getNumberOfStudents());  
  30.   
  31.         System.out.println();  
  32.         System.out.println();  
  33.         System.out.println("The name of course1 is :"+course2.getCourseName());  
  34.         System.out.println("Number of students in course2: "  
  35.                 + course2.getNumberOfStudents());  
  36.         ArrayList<String> students2 = course1.getStudents();  
  37.         System.out.print("And the student are :");  
  38.         for (int i = 0; i < course2.getNumberOfStudents(); i++)  
  39.             System.out.print(students2.get(i) + ", ");  
  40.   
  41.     }  
  42. }  

 

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

 

3.1运行结果及其分析

1)测试结果一:

2)测试结果二:

分析:由测试结果可知,该程序完全符合实验要求。

 

3.2心得体会

 这个实验刚开始就有各种想法,也觉得比较好玩,比c++写的栈简单许多。但实现的时候还是有点下不去手的感觉。主要原因是不熟练,对于底层知识的掌握也不熟练。认真思考类之间的关系,最后得到正确结果。

 

3.3该实验的源代码如下

  1. package Lab5;  
  2. /*3.P381, 11.10)(利用继承实现MyStack)在程序清单11-10中,MyStack是用组合实现的。 
  3. 扩展ArrayList创建一个新的栈类。实 
  4. MyStack类。编写一个测试程序,提示用户输入5个字符串,然后以逆序显示这些字符串。 
  5.  
  6.  */  
  7. import java.util.ArrayList;  
  8. import java.util.Collection;  
  9. import java.util.Scanner;  
  10.   
  11. public class MyStack extends java.util.ArrayList {  
  12.     @Override  
  13.     public String toString() {  
  14.         return "MyStack{"+super.toString()+"}";  
  15.     }  
  16.   
  17.     public MyStack() {  
  18.     }  
  19.   
  20.     public MyStack(int initialCapacity) {  
  21.         super(initialCapacity);  
  22.     }  
  23.     public boolean isEmpty(){//判断栈是否为空  
  24.         return super.isEmpty();  
  25.     }  
  26.     public int getSize(){//返回栈中元素个数  
  27.         return super.size();  
  28.     }  
  29.     public Object peek(){ //获得栈顶元素  
  30.         return get(super.size()-1);  
  31.     }  
  32.     public Object pop(){//返回并删除该栈的栈顶元素  
  33.         Object o = this.peek();  
  34.         super.remove(super.size()-1);  
  35.         return o;  
  36.     }  
  37.     public void push(Object o){//增加一个新的元素到栈顶  
  38.         super.add(o);  
  39.     }  
  40.     //测试程序  
  41.     public static void main(String[] args) {  
  42.         Scanner input = new Scanner(System.in);  
  43.         System.out.println("请输入五个字符串:");  
  44.         String s;  
  45.         MyStack stack = new MyStack();  
  46.   
  47.         for(int i=0;i<5;i++)  
  48.         {  
  49.             s = input.next();  
  50.             stack.push(s);  
  51.         }  
  52.         System.out.println("用栈逆序输出得:");  
  53.        while (!stack.isEmpty()){  
  54.            System.out.print(stack.pop()+" ");  
  55.        }  
  56.   
  57.     }  
  58.   
  59. }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值