# 封装,抽象类,继承,重写java编程题 问题描述 ``` 某公司的雇员分为以下若干类: Employee:这是所有员工总的父类,属性:员工的姓名,员工的生日月份。 方法:getSalary(int

封装,抽象类,继承,重写java编程题

问题描述

某公司的雇员分为以下若干类: Employee:这是所有员工总的父类,属性:员工的姓名,员工的生日月份。
方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100元。
SalariedEmployee:Employee的子类,拿固定工资的员工。 属性:月薪
HourlyEmployee:Employee的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5倍工资发放。
属性:每小时的工资、每月工作的小时数
SalesEmployee:Employee的子类,销售人员,工资由月销售额和提成率决定。 属性:月销售额、提成率
BasePlusSalesEmployee:SalesEmployee的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。 属性:底薪。
写一个程序,把若干各种类型的员工放在一个Employee数组里,写一个方法,打印出某月每个员工的工资数额。
注意:要求把每个类都做成完全封装,不允许非私有化属性。

问题java代码


import java.util.Scanner;

public abstract class Employee {
    private String name;
    private int birthdayMonth;

    public Employee() {
        super();
    }

    public Employee(String name, int birthdayMonth) {
        super();
        this.name = name;
        this.birthdayMonth = birthdayMonth;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getBirthdayMonth() {
        return birthdayMonth;
    }

    public void setBirthdayMonth(int birthdayMonth) {
        this.birthdayMonth = birthdayMonth;
    }

    public abstract double getSalary(int month);
}


class SalariedEmployee extends Employee {
    private double monthSalary;

    public SalariedEmployee() {
        super();
    }

    public SalariedEmployee(String name, int birthdayMonth, double monthSalary) {
        super(name, birthdayMonth);
        this.monthSalary = monthSalary;
    }

    public double getMonthSalary() {
        return monthSalary;
    }

    public void setMonthSalary(double monthSalary) {
        this.monthSalary = monthSalary;
    }

    @Override
    public double getSalary(int month) {
        if (month == getBirthdayMonth()) {
            monthSalary = monthSalary + 100;
        } else {

        }
        double salary = monthSalary;
        return salary;
    }
}

class SalesEmployee extends Employee {
    private double saleroom;// 销售额
    private double rate;// 提成率

    public SalesEmployee() {
        super();
    }

    public SalesEmployee(String name, int birthdayMonth, double saleroom, double rate) {
        super(name, birthdayMonth);
        this.saleroom = saleroom;
        this.rate = rate;
    }

    public double getSaleroom() {
        return saleroom;
    }

    public void setSaleroom(double saleroom) {
        this.saleroom = saleroom;
    }

    public double getRate() {
        return rate;
    }

    public void setRate(double rate) {
        this.rate = rate;
    }

    @Override
    public double getSalary(int month) {
        double salary;
        if (month == getBirthdayMonth()) {
            salary = (saleroom * rate) + 100;
        } else {
            salary = (saleroom * rate);
        }
        return salary;

    }
}


class BasePlusSalesEmployee extends SalesEmployee {
    private double basicSalary;

    public BasePlusSalesEmployee() {
        super();
    }

    public BasePlusSalesEmployee(String name, int birthdayMonth, double saleroom, double rate, double basicSalary) {
        super(name, birthdayMonth, saleroom, rate);
        this.basicSalary = basicSalary;
    }

    public double getBasicSalary() {
        return basicSalary;
    }

    public void setBasicSalary(double basicSalary) {
        this.basicSalary = basicSalary;
    }

    @Override
    public double getSalary(int month) {
        double salary = getSaleroom() * getRate() + basicSalary;
        if (month == getBirthdayMonth()) {
            salary += 100;
        } else {
        }
        return salary;
    }
}

class HourlyEmployee extends Employee {
    private double salaryHour;//每小时工资
    private double mountHour;//一个月的工作小时数

    public HourlyEmployee() {
    }

    public HourlyEmployee(String name, int birthdayMonth, double salaryHour, double mountHour) {
        super(name, birthdayMonth);
        this.salaryHour = salaryHour;
        this.mountHour = mountHour;
    }

    public double getSalaryHour() {
        return salaryHour;
    }

    public void setSalaryHour(double salaryHour) {
        this.salaryHour = salaryHour;
    }

    public double getMountHour() {
        return mountHour;
    }

    public void setMountHour(double mountHour) {
        this.mountHour = mountHour;
    }

    @Override
    public double getSalary(int month) {
        double salary;
        if (mountHour <= 160) {
            salary = salaryHour * mountHour;
        } else {
            salary = (mountHour - 160) * salaryHour * 1.5 + mountHour * salaryHour;
        }
        return salary;
    }
}

class Test {
    public static void main(String[] args) {
        Employee[] em = new Employee[4];
        em[0] = new SalariedEmployee("王3", 8, 5000);

        em[1] = new SalesEmployee("李4", 11, 1000, 0.2);

        em[2] = new HourlyEmployee("杨5", 9, 20, 400);

        em[3] = new BasePlusSalesEmployee("张6", 7, 6000, 0.2, 3000);
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入当前月份: ");
        int mouth = sc.nextInt();
        for (int i = 0; i < 4; i++) {
            System.out.print("姓名 : " + em[i].getName() + ",生日月份:   " + em[i].getBirthdayMonth()
                    + ", 本月工资: " + em[i].getSalary(mouth) + "\n");

        }
    }
}

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这题目是关于某公司员工分类问题。共分为5类,每类的员工都有相应的封装类,共有5个类的信息如下: (1) employee这是所有员工父类。 ① 属性员工姓名员工生日月份。 ② 方法getsalary(int)。 根据这些信息,可以推断出这是一个面向对象的程序设计问题,要求设计和实现5个类及其相关属性方法。其中,employee是所有员工父类,其他员工类都是从employee继承而来,每个员工类都有自己的特定属性方法。例如,Manager类会有自己的奖金属性getSalary()方法会根据员工的工资和奖金计算员工收入。 ### 回答2: 首先,这道题目涉及到五个类,其中一个是父类employee,我们可以从这个父类开始了解。 employee类有两个属性,分别是员工姓名生日月份。同时有一个方法getSalary(int month),表示该员工月份为month的时候的薪水。 接下来,我们看看这个父类employee的5个派生类,即分别是: 1. 全职员工FullTimeEmployee 2. 兼职员工PartTimeEmployee 3. 销售员工SalesEmployee 4. 管理员工ManagerEmployee 5. 技术员工TechnicalEmployee 这五个类中,每个类都有一个构造方法和一个getSalary(int month)方法。 全职员工FullTimeEmployee类: 该类的属性包括工作时长和基本工资,getSalary(int month)方法返回该员工指定月份的薪水。 兼职员工PartTimeEmployee类: 该类的属性包括工作小时数和每小时的工资,getSalary(int month)方法返回该员工指定月份的薪水。 销售员工SalesEmployee类: 该类的属性包括销售额和提成比例,getSalary(int month)方法返回该员工指定月份的薪水。其中提成比例为该员工的一个属性。 管理员工ManagerEmployee类: 该类的属性包括绩效指数和基本工资,getSalary(int month)方法返回该员工指定月份的薪水。 技术员工TechnicalEmployee类: 该类的属性包括工作时长和基本工资,getSalary(int month)方法返回该员工指定月份的薪水。与全职员工类似,这里也需要记录工作时长。 以上就是五个派生类的属性方法,每个类都可以单独找出并讨论。最后,我想结一下这个题目的几个点: 1. 该公司雇员分为了五类,每个类都有相应的属性方法。 2. 全职和技术员工记录工作时长,销售和管理员工记录绩效和销售额,兼职员工记录工作小时数。 3. 每个派生类都有一个构造方法和一个getSalary(int month)方法,用于计算指定月份员工的薪水。 ### 回答3: 本题涉及面向对象编程的基础知识,需要对类、属性方法有一定的理解。 首先,根据题目所给信息,可以确定某公司雇员分为5类,每类员工都有相应的封装类。那么,我们需要先确定这5个类的名称和属性方法。 1. 父类Employee 根据题目所给信息,可以确定Employee是所有员工父类。因此,它应该具备一些通用的属性方法,子类可以继承重写它们。 ① 属性员工姓名员工生日月份 这两个属性Employee类的基本属性,它们可以用private关键字封装起来,只能通过public方法访问。 ② 方法getsalary(int month) 这个方法是根据月份计算员工工资的方法,它应该是抽象方法或者虚拟方法,由子类具体实现。在Employee类中,可以将它定义为虚拟方法,并提供一个默认的实现,返回0。 2. 子类SalariedEmployee SalariedEmployee是固定薪水的员工类,它应该从Employee继承下来。 ① 属性:基本工资 这个属性是SalariedEmployee类的特有属性,它可以用private关键字封装起来。 ② 方法getsalary(int month) 这个方法是计算薪水的方法,它应该根据员工的基本工资和月份计算出薪水。由于这是一个虚拟方法,在SalariedEmployee类中需要实现它。 3. 子类HourlyEmployee HourlyEmployee是按小时计费的员工类,它应该从Employee继承下来。 ① 属性:每小时的工资,工作小时数 这两个属性是HourlyEmployee类的特有属性,它们可以用private关键字封装起来。 ② 方法getsalary(int month) 这个方法是计算薪水的方法,它应该根据员工的每小时工资和工作小时数计算出薪水。由于这是一个虚拟方法,在HourlyEmployee类中需要实现它。 4. 子类CommissionEmployee CommissionEmployee是根据销售量提成的员工类,它应该从Employee继承下来。 ① 属性:销售额,提成比率 这两个属性是CommissionEmployee类的特有属性,它们可以用private关键字封装起来。 ② 方法getsalary(int month) 这个方法是计算薪水的方法,它应该根据员工的销售额和提成比率计算出薪水。由于这是一个虚拟方法,在CommissionEmployee类中需要实现它。 5. 子类BasePlusCommissionEmployee BasePlusCommissionEmployee是有底薪的员工类,它应该从CommissionEmployee继承下来。 ① 属性:底薪 这个属性是BasePlusCommissionEmployee类的特有属性,它可以用private关键字封装起来。 ② 方法getsalary(int month) 这个方法是计算薪水的方法,它应该根据员工的底薪、销售额和提成比率计算出薪水。由于这是一个虚拟方法,在BasePlusCommissionEmployee类中需要实现它。 以上就是对题目的回答,五个类中每个类的属性方法都在此回答之中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pofenx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值