Java基础(员工工资管理系统)
Java基础(员工工资管理系统)项目介绍:某公司的雇员分为以下若⼲类:SalariedEmployee:拿固定⼯资的员⼯。HourlyEmployee:按⼩时拿⼯资的员⼯,每⽉⼯作超出160⼩时的部分按照1.5倍⼯资发放SalesEmployee:销售⼈员,⼯资由⽉销售额和提成率决定。3万以下,提成率5%,3万以上提成率8%BasePlusSalesEmployee:有固定底薪的销售⼈员,⼯资由底
项目介绍:
某公司的雇员分为以下若⼲类:
SalariedEmployee:拿固定⼯资的员⼯。
HourlyEmployee:按⼩时拿⼯资的员⼯,每⽉⼯作超出160⼩时的部分按照1.5倍⼯资发放
SalesEmployee:销售⼈员,⼯资由⽉销售额和提成率决定。3万以下,提成率5%,3万以上提成率8%
BasePlusSalesEmployee:有固定底薪的销售⼈员,⼯资由底薪加上销售提成部分。 提成率5%
所有员工如果该⽉员⼯过⽣⽇,则公司会额外奖励100元。
注意:要求把每个类都做成完全封装,不允许⾮私有化属性。
项目分析
- 每个员工都有姓名,薪资,生日月份的属性,因此可以设计以下类
设计一个所有员工的总父类Employee,具有姓名,生日的属性,具有根据生日月份确定工资一个方法
SalariedEmployee 是Employee的子类 ,拿固定工资,拥有独立的属性月薪
HourlyEmployee是Employee的子类, 独立的属性:每小时的工资数,每月工作的小时数
SalesEmployee 是Employee的子类 独立的属性:销售额
BasePlusSalesEmployee 是SalesEmployee的子类:独立的属性: 底薪
知识了解
Java抽象(abstract)类
在 Java 中抽象类的语法格式如下:
其中,abstract 表示该类或该方法是抽象的;class_name 表示抽象类的名称;method_name 表示抽象方法名称,parameter-list 表示方法参数列表。<abstract>class<class_name> { <abstract><type><method_name>(parameter-iist); }
如果一个方法使用 abstract 来修饰,则说明该方法是抽象方法,抽象方法只有声明没有实现。需要注意的是 abstract 关键字只能用于普通方法,不能用于 static 方法或者构造方法中。
抽象方法的 3 个特征如下:
- 抽象方法没有方法体
- 抽象方法必须存在于抽象类中
- 子类重写父类时,必须重写父类所有的抽象方法
注意:在使用 abstract 关键字修饰抽象方法时不能使用 private 修饰,因为抽象方法必须被子类重写,而如果使用了 private 声明,则子类是无法重写的。
抽象类的定义和使用规则如下:
- 抽象类和抽象方法都要使用 abstract 关键字声明。
- 如果一个方法被声明为抽象的,那么这个类也必须声明为抽象的。而一个抽象类中,可以有 0~n 个抽象方法,以及 0~n 个具体方法。
- 抽象类不能实例化,也就是不能使用 new 关键字创建对象。
Calendar的使用
一、 如何创建 Calendar 对象
Calendar 是一个抽象类, 无法通过直接实例化得到对象。因此, Calendar 提供了一个方法 getInstance,来获得一个Calendar对象, 得到的 Calendar 由当前时间初始化。
Calendar cal = Calendar.getInstance();
二、 字段解释
Calendar 中 set 和 get 时间都是通过在参数中填入不同的字段来实现的, 不过有部分字段的常量值与约定俗成的值不相同。
下面字段我们以 1997 年 11 月 09 日 00 时 13分 11 秒 来讲解
Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 1997); cal.set(Calendar.MONTH, 11); cal.set(Calendar.DATE, 09); cal.set(Calendar.HOUR_OF_DAY, 00); cal.set(Calendar.MINUTE, 13); cal.set(Calendar.SECOND, 11);
- YEAR:默认情况下指示为当前年份。
- MONTH:指示当前年中的月份数,一年中的一月的值为 0
- 需要注意的是 JANUARY, FEBRUARY, MARCH,,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER 分别与 [0, 11] 对应,在设置和获取日期时要格外注意。
- WEEK_OF_YEAR:指示当前年中的星期数。 一年中的第一个星期的值为 1。
- WEEK_OF_MONTH:指示当前月中的星期数。 一个月中第一个星期的值为 1。
- DAY_OF_MONTH:指示一个月中的某天。它与 DATE 是同义词. 一个月中第一天的值为 1。
- DATE:同 DAY_OF_MONTH
- DAY_OF_YEAR:指示当前年中的天数。 一年中第一天的值为 1。
- DAY_OF_WEEK:指示一个星期中的某天。 一周中第一天的值为 1。
- 需要注意的是, 与中国人的习惯不同, 此处一周中的第一天为 周日。 一周的顺序依次为: 周日(1),周一(2), 周二(3), 周三(4), 周四(5),周五(6), 周六(7) 在设置和获取日期时要格外注意。
- AM_PM:指示 HOUR 是在中午之前还是在中午之后。[0, 12) 为上午, AM_PM 值为 1 [12, 24)为下午,AM_PM 值为 0。
- HOUR:指示上午或下午的小时。
- 例子中 HOUR 为 11
- HOUR_OF_DAY:指示一天中的小时。 HOUR_OF_DAY 用于 24 小时制时钟。
- 例子中 HOUR_OF_DAY 为 23
- MINUTE:指示一小时中的分钟
- 例子中 MINUTE 为 11
- SECOND:指示一分钟中的秒
- 例子中 SECOND 为 11
源码 :
Employee.java
package overproject;
import java.util.Calendar;
//销售父类为抽象类,不同的子类定义不同的计算工资方法
public abstract class Employee {
private String name;//姓名
private int month;//生日月份
//构造方法
public Employee(String name,int month) {
this.name=name;
this.month=month;
}
//姓名和生日月份的get set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setMonth(int month) {
this.month = month;
}
public int getMonth() {
return month;
}
//计算工资方法
//使用抽象方法
//抽象方法只有声明没有实现。需要注意的是 abstract 关键字只能用于普通方法,不能用于 static 方法或者构造方法中。
public abstract double getSalary();
//判断是否为生日月份,获取额外工资
public double getSalarybyBrith()
{
Calendar calendar= Calendar.getInstance();
int mm=calendar.get(Calendar.MONTH)+1;//默认0-11
if(month==mm)
{
return 100;
}
else
return 0;
}
}
SalariedEmployee.java
package overproject;
//拿固定⼯资的员⼯类
public class SalariedEmployee extends Employee{
private double monthSalary;//固定月薪月薪
//set get方法
public double getMonthSalary() {
return monthSalary;
}
public void setMonthSalary(double monthSalary) {
this.monthSalary = monthSalary;
}
//构造方法
public SalariedEmployee(String name, int month, double monthSalary) {
super(name, month);//调用父类构造方法
this.monthSalary = monthSalary;
}
//计算工资方法
@Override
public double getSalary() {
//当月薪资加是否为生日月份
return this.monthSalary+this.getSalarybyBrith();
}
}
HourlyEmployee.java
package overproject;
//小时工
public class HourlyEmployee extends Employee{
private double timesalaries;//每小时工资
private int timemonth;//每月工作小时数
//构造函数
public HourlyEmployee(String name, int month, double timesalaries,int timemonth) {
super(name, month);
this.timesalaries = timesalaries;
this.timemonth = timemonth;
}
//set get方法
public double getTimesalaries() {
return timesalaries;
}
public void setTimesalaries(double timesalaries) {
this.timesalaries = timesalaries;
}
public double getTimemonth() {
return timemonth;
}
public void setTimemonth(int timemonth) {
this.timemonth = timemonth;
}
//计算工资方法
//每⽉⼯作超出160⼩时的部分按照1.5倍⼯资发放
@Override
public double getSalary() {
if(this.timemonth<160&&this.timemonth>0)
{
return (this.timemonth*this.timesalaries)+this.getSalarybyBrith();
}
else if(this.timemonth>160)
{
return ((this.timemonth-160)*(this.timesalaries*1.5))+160*this.timesalaries+this.getSalarybyBrith();
}
else
return 0;
}
}
SalesEmployee.java
package overproject;
//无固定底薪的销售工
//⼯资由⽉销售额和提成率决定。3万以下,提成率5%,3万以上提成率8%
public class SalesEmployee extends Employee{
private double sales;//销售额
public SalesEmployee(String name, int month, double sales) {
super(name, month);
this.sales = sales;
}
public double getSales() {
return this.sales;
}
public void setSales(double sales) {
this.sales = sales;
}
//计算工资方法
@Override
public double getSalary() {
if(sales<30000&&sales>0)
{
return sales*0.05+this.getSalarybyBrith();
}
else if(sales>30000)
{
return 30000*0.05+(sales-30000)*0.08+this.getSalarybyBrith();
}
else
return 0;
}
}
BasePlusSalesEmployee.java
package overproject;
//有固定底薪的销售⼈员,⼯资由底薪加上销售提成部分。 提成率5%
public class BasePlusSalesEmployee extends SalesEmployee{
private double salarlies;//底薪
public BasePlusSalesEmployee(String name, int month, double sales, double salarlies) {
super(name, month, sales);
this.salarlies = salarlies;
}
public double getSalarlies() {
return salarlies;
}
public void setSalarlies(double salarlies) {
this.salarlies = salarlies;
}
//计算工资方法
@Override
public double getSalary(){
return this.salarlies+this.getSales()*0.05+this.getSalarybyBrith();
}
}
test.java
package overproject;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
System.out.println("请输入拿固定工资的人数:");
int number1=sc.nextInt();
//创建一个数组,保存number1个固定工资的人数
SalariedEmployee[] salariedemployee=new SalariedEmployee[number1];
System.out.println("请输入拿无固定底薪的人数:");
int number2=sc.nextInt();
SalesEmployee[] salesEmployee=new SalesEmployee[number2];
System.out.println("请输入拿有固定底薪的人数:");
int number3=sc.nextInt();
BasePlusSalesEmployee[] basePlusSalesEmployee=new BasePlusSalesEmployee[number3];
System.out.println("请输入打小时工的人数:");
int number4=sc.nextInt();
HourlyEmployee[] hourlyEmployee=new HourlyEmployee[number4];
int type;
do {
System.out.println("***欢迎使用员工工资管理系统****");
System.out.println("**************************");
System.out.println("0-退出 1-固定工资员工");
System.out.println("2-无固定底薪 3-有固定底薪");
System.out.println("4-小时工 5-打印工资表 ");
System.out.println("请输入选项:");
type=sc.nextInt();
switch (type) {
case 1:
for (int i = 0; i < salariedemployee.length; ++i) {
System.out.println("请输入第"+(i+1)+"个员工姓名:");
String name = sc.next();
System.out.println("请输入第"+(i+1)+"个员工出生月份:");
int month = sc.nextInt();
System.out.println("请输入第"+(i+1)+"个员工月薪:");
double monthSalary = sc.nextDouble();
SalariedEmployee salariedemployees = new SalariedEmployee(name, month, monthSalary);
salariedemployee[i] = salariedemployees;
}
break;
case 2:
for (int i = 0; i < salesEmployee.length; ++i) {
System.out.println("请输入第"+(i+1)+"个员工姓名:");
String name = sc.next();
System.out.println("请输入第"+(i+1)+"个员工出生月份:");
int month = sc.nextInt();
System.out.println("请输入第"+(i+1)+"个员工销售额:");
int sales = sc.nextInt();
SalesEmployee salesEmployees = new SalesEmployee(name, month, sales);
salesEmployee[i] = salesEmployees;
}
break;
case 3:
for (int i = 0; i < basePlusSalesEmployee.length; ++i) {
System.out.println("请输入第"+(i+1)+"个员工姓名:");
String name = sc.next();
System.out.println("请输入第"+(i+1)+"个员工出生月份:");
int month = sc.nextInt();
System.out.println("请输入第"+(i+1)+"个员工销售额:");
int sales = sc.nextInt();
System.out.println("请输入第"+(i+1)+"个员工底薪:");
int salarlies = sc.nextInt();
BasePlusSalesEmployee basePlusSalesEmployees = new BasePlusSalesEmployee(name, month, sales, salarlies);
basePlusSalesEmployee[i] = basePlusSalesEmployees;
}
break;
case 4:
for (int i = 0; i < hourlyEmployee.length; ++i) {
System.out.println("请输入第"+(i+1)+"个员工姓名:");
String name = sc.next();
System.out.println("请输入第"+(i+1)+"个员工出生月份:");
int month = sc.nextInt();
System.out.println("请输入第"+(i+1)+"个员工每月工作时长(h):");
int timemonth = sc.nextInt();
System.out.println("请输入第"+(i+1)+"个员工每小时时薪:");
int timesalaries = sc.nextInt();
HourlyEmployee hourlyEmployees = new HourlyEmployee(name, month, timesalaries, timemonth);
hourlyEmployee[i] = hourlyEmployees;
}
break;
case 5:
for (int i = 0; i < salariedemployee.length; ++i) {
System.out.println("员工姓名:" + salariedemployee[i].getName() + "\t\t" + "员工薪资:" + salariedemployee[i].getSalary());
}
for (int i = 0; i < salesEmployee.length; ++i) {
System.out.println("员工姓名:" + salesEmployee[i].getName() + "\t\t" + "员工薪资:" + salesEmployee[i].getSalary());
}
for (int i = 0; i < basePlusSalesEmployee.length; ++i) {
System.out.println("员工姓名:" + basePlusSalesEmployee[i].getName() + "\t\t" + "员工薪资:" + basePlusSalesEmployee[i].getSalary());
}
for (int i = 0; i < hourlyEmployee.length; ++i){
System.out.println("员工姓名:" + hourlyEmployee[i].getName() + "\t\t" + "员工薪资:" + hourlyEmployee[i].getSalary());
}
break;
case 0:
break;
default:
System.out.println("您的输入有误!请重新输入");
}
}while(type!=0);
}
}
最终效果:
这是一个练手的小项目,适合初学Java,对基本知识的一个复习
更多推荐
所有评论(0)