实验简介
实验报告涉及以下内容
- 继承中父子构造方法的执行关系
- 重写
- super的应用
- 上转型
- 多态
一、 实验一
1. 实验内容
假定根据学生的3门学位课程的分数决定其是否可以拿到学位,对于本科生,如果3门课程的平均分数超过60分即表示通过,而对于研究生,则需要平均超过80分才能够通过。根据上述要求,请完成以下Java类的设计:
(1)设计一个基类Student描述学生的共同特征。
(2)设计一个描述本科生的类Undergraduate,该类继承并扩展Student类。
(3)设计一个描述研究生的类Graduate,该类继承并扩展Student类。
(4)设计一个测试类StudentDemo,分别创建本科生和研究生这两个类的对象,并输出相关信息。
2. 实验分析
抽象类Student中:name和id都是protected修饰的,其中还有static修饰id用于设置自增的学号,包含抽象方法:canGetDiploma()用于判断是否能获得学位证的方法
3. 实验代码
- Student类
package Moth11.JichengAndDuotai;
public abstract class Student {
protected String name;//学生姓名
protected static int id=0;//学生学号,设置自增的id不用每创立一个学生都要自己去设置
/**
* 构造方法
* 学号+1,设置学生姓名
* @param name
*/
public Student(String name){
this.name = name;
id++;
}
/**
* 抽象方法,判断学生是否能成功拿到学位证
* @return
*/
public abstract boolean canGetDiploma();
}
- UnderGraduate类
package Moth11.JichengAndDuotai;
public class UnderGraduate extends Student {
//定义三门科目
private int class01;
private int class02;
private int class03;
/**
* 构造方法
* 设置姓名,打印学号姓名身份,运用super调用父类构造方法
* @param name
*/
public UnderGraduate(String name){
super(name);
System.out.println(name+"是一名本科生,学号是:"+id);
}
/**
* 以下是Getter&Setter
*/
public int getClass01() {
return class01;
}
public void setClass01(int class01) {
this.class01 = class01;
}
public int getClass02() {
return class02;
}
public void setClass02(int class02) {
this.class02 = class02;
}
public int getClass03() {
return class03;
}
public void setClass03(int class03) {
this.class03 = class03;
}
/**
* 重写父类的抽象方法
* @return
*/
@Override
public boolean canGetDiploma(){
if(class01+class02+class03 >= 180){
System.out.println(name+"能够成功拿到学位证");
return true;
}
System.out.println(name+"不能够成功拿到学位证");
return false;
}
}
- Student类
package Moth11.JichengAndDuotai;
public class Graduate extends Student{
//定义三门科目
private int class04;
private int class05;
private int class06;
/**
* 构造方法
* 设置姓名,打印学号姓名身份,运用super调用父类构造方法
* @param name
*/
public Graduate(String name) {
super(name);
System.out.println(name+"是一名研究生,学号是:"+id);
}
/**
* 以下是Getter&Setter
*/
public int getClass04() {
return class04;
}
public void setClass04(int class04) {
this.class04 = class04;
}
public int getClass05() {
return class05;
}
public void setClass05(int class05) {
this.class05 = class05;
}
public int getClass06() {
return class06;
}
public void setClass06(int class06) {
this.class06 = class06;
}
/**
* 重写父类的抽象方法
* @return
*/
@Override
public boolean canGetDiploma(){
if(class04+class05+class06 >= 240){
System.out.println(name+"能够成功拿到学位证");
return true;
}
System.out.println(name+"不能够成功拿到学位证");
return false;
}
}
- Studentdemo类 包含main方法
package Moth11.JichengAndDuotai;
import java.util.Scanner;
public class Studentdemo {
public static void main(String[] args) {
int score1,score2,score3;//三门课的成绩,后续输入
Scanner sc =new Scanner(System.in);
Student s ;//定义一个学生
//创建一个本科生
UnderGraduate u1 = new UnderGraduate("xiaoming");
s = u1;//上转型的运用
System.out.println("请分别录入该同学的三科成绩:");
score1 = sc.nextInt();u1.setClass01(score1);
score2 = sc.nextInt();u1.setClass02(score2);
score3 = sc.nextInt();u1.setClass03(score3);
s.canGetDiploma();
//创建一个研究生
Graduate g1 = new Graduate("lihua");
s = g1;//上转型的运用
System.out.println("请分别录入该同学的三科成绩:");
score1 = sc.nextInt();g1.setClass04(score1);
score2 = sc.nextInt();g1.setClass05(score2);
score3 = sc.nextInt();g1.setClass06(score3);
s.canGetDiploma();
}
}
4. 运行结果

二、实验二
1. 实验内容
假定要为某个公司编写雇员(40个雇员)工资支付程序,这个公司有各种类型的雇员(Employee),不同类型的雇员按不同的方式支付工资:
(1)经理(Manager)——每月获得一份固定的工资
(2)销售人员(Salesman)——在基本工资的基础上每月还有销售提成。
(3)一般工人(Worker)——则按他每月工作的天数计算工资。
根据上述要求试用类的继承和相关机制描述这些功能,并编写一个Java Application程序,演示这些类的用法。(提示:应设计一个雇员类(Employee)描述所有雇员的共图特性,这个类应该提供一个计算工资的抽象方法ComputeSalary( ),使得可以通过这个类计算所有雇员的工资。经理、销售人员和一般工人对应的类都应该继承这个类,并重新定义计算工资的方法,进而给出它的具体实现。(用对象数组)
2. 实验分析
Employee所包含的方法都是抽象方法
3. 实验代码
- Employee类(抽象类)
package Moth11.JichengAndDuotai.Employees;
import java.util.ArrayList;
import java.util.List;
public abstract class Employee {
/**
* 获取员工类型,是经理、销售员还是工人
* @return
*/
public abstract String getEmployeeName();
/**
* 计算薪资
* @return
*/
public abstract double ComputeSalary();
}
- Manager类extends Employee
package Moth11.JichengAndDuotai.Employees;
public class Manager extends Employee{
private static int id = 0;
private final int employeeSalary = 20000;//固定工资
/**
* 构造方法
*/
public Manager(){
id++;
System.out.print("创建了第"+id+"位经理,");
}
/**
* 获取身份为manager
* @return
*/
@Override
public String getEmployeeName() {
return "Manerger";
}
/**
* 获取工资
* @return
*/
@Override
public double ComputeSalary() {
return employeeSalary;
}
}
- Salesman类 extends Employee
package Moth11.JichengAndDuotai.Employees;
public class Salesman extends Employee {
private static int id = 0;
private final int basicSalary = 5000;//基础工资为5000
private int sales = 0;//额外销售额
/**
* 构造方法
*/
public Salesman(){
id++;
System.out.print("创建了第"+id+"位销售员,");
}
/**
* 设置销售额
* @param sales
*/
public void setSales(int sales) {
this.sales = sales;
}
/**
* 获取身份类型为Salesman
* @return
*/
@Override
public String getEmployeeName() {
return "Salesman";
}
/**
* 获取工资额
* @return
*/
@Override
public double ComputeSalary() {
double all;
all = basicSalary + sales*0.1;
return all;
}
}
- Worker类 extends Employee
package Moth11.JichengAndDuotai.Employees;
public class Worker extends Employee{
private static int id = 0;
private int days = 0;//工作天数
/**
* 构造方法
*/
public Worker(){
id++;
System.out.print("创建了第"+id+"位工人,");
}
/**
* 设置工作天数
* @param days
*/
public void setDays(int days) {
this.days = days;
}
/**
* 获取身份为Worker
* @return
*/
@Override
public String getEmployeeName() {
return "Worker";
}
/**
* 获取工资额
* @return
*/
@Override
public double ComputeSalary() {
double all;
all = days * 300;
return all;
}
}
- Employees类,容纳Employee
package Moth11.JichengAndDuotai.Employees;
import java.util.ArrayList;
import java.util.List;
public class Employees {
//定义一个集合来存储员工
private List<Employee> employees= new ArrayList<>();
/**
* 添加一名员工
* @param employee
*/
public void addEmployee(Employee employee){
employees.add(employee);
}
/**
* 获取第i名员工
* @param i
* @return
*/
public Employee getEmployee(int i){
return employees.get(i);
}
}
- 测试类
package Moth11.JichengAndDuotai.Employees;
import java.util.Random;
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
Employees employees = new Employees();
Employee e;
Random r = new Random();
Scanner sc = new Scanner(System.in);
/**
* 创建40名员工,并获取员工工资
* 销售e和工作天数通过随机数来确定
*/
for (int i = 0; i < 5; i++) {
Manager m = new Manager();
e = m;
employees.addEmployee(e);
System.out.println("该员工的工资为:"+e.ComputeSalary());
}
for (int i = 0; i < 15; i++) {
Salesman s = new Salesman();
e = s;
employees.addEmployee(e);
s.setSales(r.nextInt(30000)+20000);
System.out.println("该员工的工资为:"+e.ComputeSalary());
}
for (int i = 0; i < 20; i++) {
Worker w = new Worker();
e = w;
employees.addEmployee(e);
w.setDays(r.nextInt(31));
System.out.println("该员工的工资为:"+e.ComputeSalary());
}
/**
* 查询指定的员工身份和工资
*/
System.out.println();
System.out.println("请输入你要查询的员工号:");
int num = sc.nextInt();
System.out.println("这是一名"+employees.getEmployee(num-1).getEmployeeName());
System.out.println("该员工的工资为:"+employees.getEmployee(num-1).ComputeSalary());
}
}
4. 运行结果

本文介绍了一个学位评定系统,本科生和研究生根据课程成绩决定是否获得学位。同时,设计了一个薪资计算系统,包括经理、销售员和工人的不同薪资计算方式。

被折叠的 条评论
为什么被折叠?



