【Java作业】继承与多态

简介: 【Java作业】继承与多态

一、实验名称

实验五 继承与多态

二、实验内容

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.面向抽象的编程;


四、类图/类关系图/交互图等

q4.png


q3.png



五、程序

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

六、测试

q1.png

相关文章
|
5月前
|
Java 编译器 程序员
java中重载和多态的区别
本文详细解析了面向对象编程中多态与重载的概念及其关系。多态是OOP的核心,分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要通过方法重载和运算符重载实现,如Java中的同名方法因参数不同而区分;运行时多态则依赖继承和方法重写,通过父类引用调用子类方法实现。重载是多态的一种形式,专注于方法签名的多样性,提升代码可读性。两者结合增强了程序灵活性与扩展性,帮助开发者更好地实现代码复用。
189 0
|
10月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
854 60
|
8月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
454 15
|
11月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
184 3
|
11月前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
218 2
|
11月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
160 2
|
11月前
|
存储 Java 测试技术
Java零基础-多态详解
【10月更文挑战第10天】Java零基础教学篇,手把手实践教学!
177 4
|
11月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
219 1
|
11月前
|
Java 编译器 程序员
Java多态背后的秘密:动态绑定如何工作?
本文介绍了Java中多态的实现原理,通过动态绑定和虚拟方法表,使得父类引用可以调用子类的方法,增强了代码的灵活性和可维护性。文中通过具体示例详细解析了多态的工作机制。
224 4
|
11月前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第4天】Java零基础教学篇,手把手实践教学!
127 2

热门文章

最新文章