继承与多态实验报告

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

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

实验简介

实验报告涉及以下内容

  1. 继承中父子构造方法的执行关系
  2. 重写
  3. super的应用
  4. 上转型
  5. 多态

一、 实验一

1. 实验内容

假定根据学生的3门学位课程的分数决定其是否可以拿到学位,对于本科生,如果3门课程的平均分数超过60分即表示通过,而对于研究生,则需要平均超过80分才能够通过。根据上述要求,请完成以下Java类的设计:
(1)设计一个基类Student描述学生的共同特征。
(2)设计一个描述本科生的类Undergraduate,该类继承并扩展Student类。
(3)设计一个描述研究生的类Graduate,该类继承并扩展Student类。
(4)设计一个测试类StudentDemo,分别创建本科生和研究生这两个类的对象,并输出相关信息。

2. 实验分析

«abstract» Student String name int id boolean canGetDIploma Student(String name) UnderGraduate int class01 int class02 int class03 UnderGraduate(String name) getClass01() setClass01(int class01) getClass02() setClass02(int class02) getClass03() setClass03(int class03) canGetDiploma() Graduate int class04 int class05 int class06 Graduate(String name) getClass04() setClass04(int class04) getClass05() setClass05(int class05) getClass06() setClass06(int class06) canGetDiploma() Studentdemo main() exteands exteands use use(上转型运用) use

抽象类Student中:name和id都是protected修饰的,其中还有static修饰id用于设置自增的学号,包含抽象方法:canGetDiploma()用于判断是否能获得学位证的方法

3. 实验代码

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

  1. 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;
    }
}

  1. 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;
    }
}

  1. 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. 实验分析

«abstract» Employee getEmployeeName() ComputeSalary() Manager int id int employeeSalary Manager() getEmployeeName() ComputeSalary() Salesman int id int basicSalary int sales Salesman() setSales(int sales) getEmployeeName() ComputeSalary() Worker int id int days Worker() setDays(int days) getEmployeeName() ComputeSalary() Application main() Employees List<Employee> employees addEmployee(Employee employee) getEmployee(int i) extends extends extends use(上转型的应用) use use use use include

Employee所包含的方法都是抽象方法

3. 实验代码

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

  1. 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;
    }
}

  1. 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;
    }
}

  1. 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;
    }
}

  1. 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);
    }
}

  1. 测试类
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. 运行结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值