一、实验名称
实验五 继承与多态
二、实验内容
1.假定根据学生的3门学位课程的分数决定其是否可以拿到学位,对于本科生,如果3门课程的平均分数超过60分即表示通过,而对于研究生,则需要平均超过80分才能够通过。根据上述要求,请完成以下Java类的设计:
(1)设计一个基类Student描述学生的共同特征。
(2)设计一个描述本科生的类Undergraduate,该类继承并扩展Student类。
(3)设计一个描述研究生的类Graduate,该类继承并扩展Student类。
(4)设计一个测试类StudentDemo,分别创建本科生和研究生这两个类的对象,并输出相关信息。
2.假定要为某个公司编写雇员(40个雇员)工资支付程序,这个公司有各种类型的雇员(Employee),不同类型的雇员按不同的方式支付工资:
(1)经理(Manager)——每月获得一份固定的工资
(2)销售人员(Salesman)——在基本工资的基础上每月还有销售提成。
(3)一般工人(Worker)——则按他每月工作的天数计算工资。
根据上述要求试用类的继承和相关机制描述这些功能,并编写一个Java Application程序,演示这些类的用法。(提示:应设计一个雇员类(Employee) 描述所有雇员的共图特性,这个类应该提供一个计算工资的抽象方法 ComputeSalary( ),使得可以通过这个类计算所有雇员的工资。经理、销售 人员和一般工人对应的类都应该继承这个类,并重新定义计算工资的方法, 进而给出它的具体实现。(用对象数组)
三、实验目的
1.掌握抽象类的声明;
2.掌握多态的执行机理;
3.掌握上转型的使用;
4.掌握构造方法的执行机理;
5.面向抽象的编程;
四、类图/类关系图/交互图等
五、程序
Part1:
思路:
一个抽象类抽象出共有的属性,然后有个抽象方法来判断是否通过考核。Graduate类和Undergraduate类继承这个抽象类,然后各自重新实现这个抽象方法。
测试时创建相应对象,输出相应数据即可。
抽象类Student:
package com.dreamchaser.work6.part1; /** * 学生类 */ public abstract class Student { protected Integer score1; protected Integer score2; protected Integer score3; protected String name; public String getName() { return name; } public Student(String name, Integer score1, Integer score2, Integer score3) { this.score1 = score1; this.score2 = score2; this.score3 = score3; this.name = name; } public abstract boolean isPass(); }
Graduate类:
package com.dreamchaser.work6.part1; public class Graduate extends Student{ public Graduate(String name, Integer score1, Integer score2, Integer score3) { super(name, score1, score2, score3); } @Override public boolean isPass() { Integer total=score1+score2+score3; if (total>=80*3){ return true; } return false; } }
Undergraduate类:
package com.dreamchaser.work6.part1; public class Undergraduate extends Student{ public Undergraduate(String name, Integer score1, Integer score2, Integer score3) { super(name, score1, score2, score3); } @Override public boolean isPass() { Integer total=score1+score2+score3; if (total>=60*3){ return true; } return false; } }
StudentDemo类:
package com.dreamchaser.work6.part1; public class StudentDemo { public static void main(String[] args) { Undergraduate undergraduate=new Undergraduate("张三",30,90,70); Graduate graduate=new Graduate("李四",80,90,70); System.out.print("本科生"+undergraduate.getName()); if (undergraduate.isPass()){ System.out.println("通过了考核"); }else{ System.out.println("未通过考核"); } System.out.print("研究生"+graduate.getName()); if (graduate.isPass()){ System.out.println("通过了考核"); }else{ System.out.println("未通过考核"); } } }
Part2:
思路:
与part1类似,Employee类中有共有的属性,如name,number,同时有一个抽象方法来计算薪资。之后的三个类各自继承Employee这个抽象类并各自实现抽象方法computeSalary,并有自己特有的属性。
测试类思路就是创建三个对象上转型将引用传递给Employee类,然后调用相应的方法输出即可。
Employee类
package com.dreamchaser.work6.part2; public abstract class Employee { /** * 共同的属性姓名 */ protected String name; /** * 工号 */ Long number; public abstract Integer computeSalary(); public Employee(String name, Long number) { this.name = name; this.number = number; } public String getName() { return name; } }
Manager
package com.dreamchaser.work6.part2; public class Manager extends Employee{ private Integer salary; public Manager(String name, Long number,Integer salary) { super(name, number); this.salary = salary; } @Override public Integer computeSalary() { return salary; } }
Salesman
package com.dreamchaser.work6.part2; public class Salesman extends Employee{ Integer salary; Integer part; public Salesman(String name, Long number, Integer salary, Integer part) { super(name, number); this.salary = salary; this.part = part; } @Override public Integer computeSalary() { return salary+part; } }
Worker
package com.dreamchaser.work6.part2; public class Worker extends Employee{ Integer dailyWage; Integer day; public Worker(String name, Long number, Integer dailyWage, Integer day) { super(name, number); this.dailyWage = dailyWage; this.day = day; } @Override public Integer computeSalary() { return day*dailyWage; } }
JavaApplication
package com.dreamchaser.work6.part2; public class JavaApplication { public static void main(String[] args) { Employee[] employees=new Employee[40]; for (int i=0;i<40;i++){ if (i%3==0){ employees[i]=new Manager("张三"+i, (long) 45613246+i,12345); }else if (i%3==1){ employees[i]=new Salesman("李四"+i, (long) 134561+i,1231,6000); }else { employees[i]=new Worker("王五"+i, (long) 4561234+i,300,12); } } for (Employee employee:employees){ System.out.println(employee.getName()+"得到的工资为"+employee.computeSalary()+"元"); } } }
六、测试