Java基础入门--面向对象课后题(2)

news2024/11/24 20:30:50

文章目录

    • 1 Employee
    • 2 SalariedEmployee
    • 3 HourlyEmployee
    • 4 SalesEmployee
    • 5 BasePlusSalesEmployee
    • 6 测试类 Example17
    • 7 完整代码

某公司的雇员分为5类,每类员工都有相应的封装类,这5个类的信息如下所示。
(1) Employee:这是所有员工总的父类。
① 属性:员工的姓名,员工的生日月份
② 方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100 元。

(2) SalariedEmployee:Employee 的子类,拿固定工资的员工。
① 属性:月薪。

(3)HourlyEmployee:Employee 的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5 倍工资发放。
① 属性:每小时的工资、每月工作的小时数。

(4) SalesEmployee:Employee 的子类,销售,工资由月销售额和提成率决定。
① 属性:月销售额、提成率。

(5) BasePlusSalesEmployee:SalesEmployee 的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。
① 属性:底薪。

本题要求根据上述雇员分类,编写一个程序,实现以下功能:
(1)创建一个Employee 数组,分别创建若干不同的Employee对象,并打印某个月的工资。
(2)每个类都完全封装,不允许非私有化属性。

完整代码在最后

1 Employee

(1) Employee:这是所有员工总的父类。
① 属性:员工的姓名,员工的生日月份
② 方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100 元。

//(1) Employee:这是所有员工总的父类。
//① 属性:员工的姓名,员工的生日月份
//② 方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100 元。
abstract class Employee {
    private String name;    //定义姓名,并私有化属性
    private int month;      //定义生日月份,私有化属性

    public Employee() {
        // 无参构造器
    }

    public Employee(String name, int month) {        //有参构造
        this.name = name;
        this.month = month;
    }

    //获取属性name的方法
    public String getName() {
        return name;
    }

    //给属性name赋初始值
    public void setName(String name) {
        this.name = name;
    }

    //获取属性month的方法
    public int getMonth() {
        return month;
    }

    //给属性month赋初始值
    public void setMonth(int month) {
        this.month = month;
    }

    //方法:getSalary(int month)
    public double getSalary(int month) {
        double salary = 0;    //定义工资变量
        //判断当前月份是否是员工的生日月份,如是奖励100元
        if (this.month == month) {
            salary += 100;
        }
        return salary;      //返回工资salary
    }
}

2 SalariedEmployee

(2) SalariedEmployee:Employee 的子类,拿固定工资的员工。
① 属性:月薪。

//(2) SalariedEmployee:Employee 的子类,拿固定工资的员工。
//① 属性:月薪。
class SalariedEmployee extends Employee {
    private double monthSalary;     //封装月薪monthSalary属性

    public SalariedEmployee() {
        //无参构造法
    }

    //有参构造法
    public SalariedEmployee(String name, int month, double monthSalary) {
        super(name, month);      //调用父类有参构造方法
        this.monthSalary = monthSalary;     //给属性monthSalary初始化赋值
    }

    //获取monthSalary的值
    public double getMonthSalary() {
        return monthSalary;
    }

    //给monthSalary赋值
    public void setMonthSalary(double monthSalary) {
        this.monthSalary = monthSalary;
    }
    //覆盖父类中的方法

    @Override
    public double getSalary(int month) {
        double salary = monthSalary + super.getSalary(month);    //重新定义工资变量,月工资加生日奖金
        return salary;
    }
}

3 HourlyEmployee

(3)HourlyEmployee:Employee 的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5 倍工资发放。
① 属性:每小时的工资、每月工作的小时数。

//(3)HourlyEmployee:Employee 的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5 倍工资发放。
//① 属性:每小时的工资、每月工作的小时数。
class HourlyEmployee extends Employee {
    private double hourlySalary;    //定义属性hourlySalary每小时的工资
    private int hours;  //定义属性hours每月工作的小时数

    public HourlyEmployee() {
    }

    public HourlyEmployee(String name, int month, double hourlySalary, int hours) {
        super(name, month);  //调用父类有参构造方法
        this.hourlySalary = hourlySalary;     //为属性hourlySalary初始化赋值
        this.hours = hours;       //为属性hours 初始化赋值
    }

    //获取hourSalary 每小时工资的值
    public double getHourlySalary() {
        return hourlySalary;
    }

    //给hourSalary 每小时工资赋值
    public void setHourlySalary(double hourlySalary) {
        this.hourlySalary = hourlySalary;
    }

    //获取hours每月工作的小时数的值
    public int getHours() {
        return hours;
    }

    //给hours每月工作的小时数赋值
    public void setHours(int hours) {
        this.hours = hours;
    }
    //覆盖父类方法

    @Override
    public double getSalary(int month) {
        //工作小时数异常
        if (hours < 0) {
            System.out.println("数据错误!");
            return 0;
        }
        //工作时间小于160
        else if (hours <= 160) {
            return hourlySalary * hours + super.getSalary(month);
        }
        //超过160的部分  1.5倍工资
        else
            return hourlySalary * 160 + 1.5 * hourlySalary * (hours - 160) + super.getSalary(month);
    }
}

4 SalesEmployee

(4) SalesEmployee:Employee 的子类,销售,工资由月销售额和提成率决定。
① 属性:月销售额、提成率。

//(4) SalesEmployee:Employee 的子类,销售,工资由月销售额和提成率决定。
//① 属性:月销售额、提成率。
class SalesEmployee extends Employee {
    private double sales;      //定义销售额sales
    private double rate;    //定义提成率rate

    public SalesEmployee() {
    }

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

    public double getSales() {
        return sales;
    }

    public void setSales(double sales) {
        this.sales = sales;
    }

    public double getRate() {
        return rate;
    }

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

    //重写父类方法
    //(1+提成率)*原销售额+其他
    @Override
    public double getSalary(int month) {
        return this.getSales() * (1 + this.getRate()) + super.getSalary(month);
    }
}

5 BasePlusSalesEmployee

(5) BasePlusSalesEmployee:SalesEmployee 的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。
① 属性:底薪。

//(5) BasePlusSalesEmployee:SalesEmployee 的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。
//① 属性:底薪。
class BasePlusSalesEmployee extends SalesEmployee {
    private double baseSalary;      //定义基础工资baseSalary

    public BasePlusSalesEmployee() {
    }

    public BasePlusSalesEmployee(String name, int age, double sales, double rate, double baseSalary) {
        super(name, age, sales, rate);
        this.baseSalary = baseSalary;
    }

    public double getBaseSalary() {
        return baseSalary;
    }

    public void setBaseSalary(double baseSalary) {
        this.baseSalary = baseSalary;
    }

    //重写父类方法
    @Override
    public double getSalary(int month) {
        return baseSalary + super.getSalary(month);
    }
}

6 测试类 Example17

public class Example17 {
    public static void main(String[] args) {
        //声明一个Employee类型的数组,并创建不同子类型的对象
        Employee[] employee = {
                new SalariedEmployee("张三", 1, 6000),
                new HourlyEmployee("李四", 2, 50, 180),
                new SalesEmployee("王五", 3, 6500, 0.15),
                new BasePlusSalesEmployee("赵六", 4, 5000, 0.15, 2000)
        };
        //打印每个员工的工资
        for (int i = 0; i < employee.length; i++) {
            System.out.println(Math.round(employee[i].getSalary(10)));
        }

    }

}


在这里插入图片描述

7 完整代码

//(1) Employee:这是所有员工总的父类。
//① 属性:员工的姓名,员工的生日月份
//② 方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100 元。
abstract class Employee {
    private String name;    //定义姓名,并私有化属性
    private int month;      //定义生日月份,私有化属性

    public Employee() {
        // 无参构造器
    }

    public Employee(String name, int month) {        //有参构造
        this.name = name;
        this.month = month;
    }

    //获取属性name的方法
    public String getName() {
        return name;
    }

    //给属性name赋初始值
    public void setName(String name) {
        this.name = name;
    }

    //获取属性month的方法
    public int getMonth() {
        return month;
    }

    //给属性month赋初始值
    public void setMonth(int month) {
        this.month = month;
    }

    //方法:getSalary(int month)
    public double getSalary(int month) {
        double salary = 0;    //定义工资变量
        //判断当前月份是否是员工的生日月份,如是奖励100元
        if (this.month == month) {
            salary += 100;
        }
        return salary;      //返回工资salary
    }
}

//(2) SalariedEmployee:Employee 的子类,拿固定工资的员工。
//① 属性:月薪。
class SalariedEmployee extends Employee {
    private double monthSalary;     //封装月薪monthSalary属性

    public SalariedEmployee() {
        //无参构造法
    }

    //有参构造法
    public SalariedEmployee(String name, int month, double monthSalary) {
        super(name, month);      //调用父类有参构造方法
        this.monthSalary = monthSalary;     //给属性monthSalary初始化赋值
    }

    //获取monthSalary的值
    public double getMonthSalary() {
        return monthSalary;
    }

    //给monthSalary赋值
    public void setMonthSalary(double monthSalary) {
        this.monthSalary = monthSalary;
    }
    //覆盖父类中的方法

    @Override
    public double getSalary(int month) {
        double salary = monthSalary + super.getSalary(month);    //重新定义工资变量,月工资加生日奖金
        return salary;
    }
}

//(3)HourlyEmployee:Employee 的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5 倍工资发放。
//① 属性:每小时的工资、每月工作的小时数。
class HourlyEmployee extends Employee {
    private double hourlySalary;    //定义属性hourlySalary每小时的工资
    private int hours;  //定义属性hours每月工作的小时数

    public HourlyEmployee() {
    }

    public HourlyEmployee(String name, int month, double hourlySalary, int hours) {
        super(name, month);  //调用父类有参构造方法
        this.hourlySalary = hourlySalary;     //为属性hourlySalary初始化赋值
        this.hours = hours;       //为属性hours 初始化赋值
    }

    //获取hourSalary 每小时工资的值
    public double getHourlySalary() {
        return hourlySalary;
    }

    //给hourSalary 每小时工资赋值
    public void setHourlySalary(double hourlySalary) {
        this.hourlySalary = hourlySalary;
    }

    //获取hours每月工作的小时数的值
    public int getHours() {
        return hours;
    }

    //给hours每月工作的小时数赋值
    public void setHours(int hours) {
        this.hours = hours;
    }
    //覆盖父类方法

    @Override
    public double getSalary(int month) {
        //工作小时数异常
        if (hours < 0) {
            System.out.println("数据错误!");
            return 0;
        }
        //工作时间小于160
        else if (hours <= 160) {
            return hourlySalary * hours + super.getSalary(month);
        }
        //超过160的部分  1.5倍工资
        else
            return hourlySalary * 160 + 1.5 * hourlySalary * (hours - 160) + super.getSalary(month);
    }
}

//(4) SalesEmployee:Employee 的子类,销售,工资由月销售额和提成率决定。
//① 属性:月销售额、提成率。
class SalesEmployee extends Employee {
    private double sales;      //定义销售额sales
    private double rate;    //定义提成率rate

    public SalesEmployee() {
    }

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

    public double getSales() {
        return sales;
    }

    public void setSales(double sales) {
        this.sales = sales;
    }

    public double getRate() {
        return rate;
    }

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

    //重写父类方法
    //(1+提成率)*原销售额+其他
    @Override
    public double getSalary(int month) {
        return this.getSales() * (1 + this.getRate()) + super.getSalary(month);
    }
}

//(5) BasePlusSalesEmployee:SalesEmployee 的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。
//① 属性:底薪。
class BasePlusSalesEmployee extends SalesEmployee {
    private double baseSalary;      //定义基础工资baseSalary

    public BasePlusSalesEmployee() {
    }

    public BasePlusSalesEmployee(String name, int age, double sales, double rate, double baseSalary) {
        super(name, age, sales, rate);
        this.baseSalary = baseSalary;
    }

    public double getBaseSalary() {
        return baseSalary;
    }

    public void setBaseSalary(double baseSalary) {
        this.baseSalary = baseSalary;
    }

    //重写父类方法
    @Override
    public double getSalary(int month) {
        return baseSalary + super.getSalary(month);
    }
}

//定义一个测试类
public class Example17 {
    public static void main(String[] args) {
        //声明一个Employee类型的数组,并创建不同子类型的对象
        Employee[] employee = {
                new SalariedEmployee("张三", 1, 6000),
                new HourlyEmployee("李四", 2, 50, 180),
                new SalesEmployee("王五", 3, 6500, 0.15),
                new BasePlusSalesEmployee("赵六", 4, 5000, 0.15, 2000)
        };
        //打印每个员工的工资
        for (int i = 0; i < employee.length; i++) {
            System.out.println(Math.round(employee[i].getSalary(10)));
        }

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1561782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Typora+picgo+cloudflare+Telegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南)

用TyporapicgocloudflareTelegraph-image的免费&#xff0c;无需服务器&#xff0c;无限空间的图床搭建&#xff08;避坑指南&#xff09; 前提&#xff1a;有github何cloudflare (没有的话注册也很快) 首先&#xff0c;是一个别人写的详细的配置流程&#xff0c;傻瓜式教程&am…

华为配置防止ARP中间人攻击实验

配置防止ARP中间人攻击实验 组网图形 图1 配置防止ARP中间人攻击组网图 动态ARP检测简介配置注意事项组网需求配置思路操作步骤配置文件 动态ARP检测简介 ARP&#xff08;Address Resolution Protocol&#xff09;安全是针对ARP攻击的一种安全特性&#xff0c;它通过一系列…

网络原理 - HTTP / HTTPS(1)——http请求

目录 一、认识HTTP协议 理解 应用层协议 二、fiddler的安装以及介绍 1、fiddler的安装 2、fiddler的介绍 三、HTTP 报文格式 1、http的请求 2、http的响应 五、认识URL 六、关于URL encode 一、认识HTTP协议 HTTP 全称为&#xff1a;“超文本传输协议”&#xff0c;是…

如何将平板或手机作为电脑的外接显示器?

先上官网链接&#xff1a;ExtensoDesk 家里有一台华为平板&#xff0c;自从买回来以后除了看视频外&#xff0c;基本没什么作用&#xff0c;于是想着将其作为我电脑的第二个屏幕&#xff0c;提高我学习办公的效率&#xff0c;废物再次利用。最近了解到华为和小米生态有多屏协同…

iPhone设备中使用第三方工具查看应用程序崩溃日志的教程

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

【MySQL】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

WebSorcket 集成 Spring Boot

WebSorcket 集成 Spring Boot 配置 Configuration public class WebSocketConfiguraion {Beanpublic ServerEndpointExporter serverEndpointExporter (){ServerEndpointExporter exporter new ServerEndpointExporter();return exporter;} }服务类 import lombok.extern.sl…

Prometheus+grafana环境搭建mysql(docker+二进制两种方式安装)(三)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前两篇 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 1.监控mysql 1.1官方地址:…

iPhone设备中如何导出和分享应用程序崩溃日志的实用方法

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

医院智慧手术麻醉系统管理源码 C# .net有演示

医院智慧手术麻醉系统管理源码 C# .net有演示 手术麻醉管理系统(DORIS)是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人进行全程跟踪与信息管理&#xff0c;自动集成病人HIS、LIS、RIS、PACS信息&#xff0c;采集监护等设备数据&#x…

【前端】FreeMarker学习笔记

文章目录 1. 介绍2.FreeMarker环境搭建(maven版本)3. 语法3.1 freemarker的数据类型3.1.1 布尔类型3.1.2 日期类型 FreeMarker视频教程 1. 介绍 中文官网 英文官网 FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML…

第三天开始写了

现在的情况 写俩个接口信息 1. 一个修改 2. 一个 删除 发现了一个问题 只有这些参数无法完成修改的 因为这些关联到一个商品表和一个用户表&#xff0c;我们应该查询他们id信息&#xff0c;修改其中的内容&#xff0c;单独根据字符串查看效果可能不好 这里我们提交应该是用…

深入探究Shrio反序列化漏洞

Shrio反序列化漏洞 什么是shrio反序列化漏洞环境搭建漏洞判断rememberMe解密流程代码分析第一层解密第二层解密2.1层解密2.2层解密 exp 什么是shrio反序列化漏洞 Shiro是Apache的一个强大且易用的Java安全框架,用于执行身份验证、授权、密码和会话管理。使用 Shiro 易于理解的…

neo4j使用详解(七、cypher数学函数语法——最全参考)

Neo4j系列导航&#xff1a; neo4j及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 5.数学函数 5.1.数值函数 数学函数仅对数字表达式进行运算&#xff0c;如果对任何其他值使用&#xff0c;将返回错误 abs()&#xf…

CentOs7.9中修改Mysql8.0.28默认的3306端口防止被端口扫描入侵

若你的服务器被入侵&#xff0c;可以从这些地方找到证据&#xff1a; 若有上述信息&#xff0c;300%是被入侵了&#xff0c;重装服务器系统以后再重装Mysql数据库&#xff0c;除了设置一个复杂的密码以外&#xff0c;还需要修改默认的Mysql访问端口&#xff0c;逃避常规端口扫描…

超图打开不同格式的dem文件

dem&#xff0c;数字高程模型&#xff1b; dem文件的后缀是什么? 有*.dem格式的&#xff0c;也有Raster&#xff0c;ASCII和Tiff类型的。Raster类型的是一个raster文件夹里面有很多不同格式的文件共同组成了DEM文件的内容。ASCII类型的是个txt文件。Tiff类型的也是一个文件夹…

江大白 | 深入浅出,Batch Size对神经网络训练的影响

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;深入浅出&#xff0c;Batch Size对神经网络训练的影响 以下文章来源于微信公众号&#xff1a;机器学习初学者 作者&#xff1a;机器学习初学者 链接&…

ESP32学习---ESP-NOW

ESP32学习---ESP-NOW 基于Arduino IDE环境获取mac地址单播通讯一对多通讯多对一通讯多对多通讯模块1代码模块2模块3 广播通讯 基于ESP-IDF框架 乐鑫编程指南中关于ESP-NOW的介绍&#xff1a;https://docs.espressif.com/projects/esp-idf/zh_CN/v5.2.1/esp32/api-reference/net…

05 | Swoole 源码分析之 WebSocket 模块

首发原文链接&#xff1a;Swoole 源码分析之 WebSocket 模块 大家好&#xff0c;我是码农先森。 引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。 与传统的 HTTP 请求-响应模型不同&#xff0c;WebSocket 可以保持…

免费开源的 AI 绘图工具 ImgPilot

免费开源的 AI 绘图工具 ImgPilot 分类 开源分享 项目名: ImgPilot -- 通过提示词及涂鸦生成图片 Github 开源地址&#xff1a; GitHub - leptonai/imgpilot: Turn the draft into amazing artwork with the power of Real-Time Latent Consistency Model 在线地址&#xff…