欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java模版方法的小练习——工资系统

程序员文章站 2022-05-03 23:43:01
题目要求解题思路1.一共涉及了5个类,父类是Employee,父类中有个属性定义的是MyDate类的对象,存储的是生日信息。两个子类HourlyEmployee、SalariedEmployee代表两种不同类型的员工。最后一个是测试类PayrollSystem2.值得讲一下的地方,是测试类中使用了Calendar类,获取当前时间,以后我们还将提到3.测试中的逻辑要清楚,如,这个地方父类是一个abstract类,不能造对象,但这里只是创建了一个Employee类型的数组名字叫p,不...

题目要求

Java模版方法的小练习——工资系统

Java模版方法的小练习——工资系统

解题思路

1.一共涉及了5个类,父类是Employee,父类中有个属性定义的是MyDate类的对象,存储的是生日信息。两个子类HourlyEmployee、SalariedEmployee代表两种不同类型的员工。

最后一个是测试类PayrollSystem

2.值得讲一下的地方,是测试类中使用了Calendar类,获取当前时间,以后我们还将提到

3.测试中的逻辑要清楚,如Java模版方法的小练习——工资系统,这个地方父类是一个abstract类,不能造对象,但这里只是创建了一个Employee类型的数组名字叫p,不是造对象,

栈里有个emps,指向了堆空间的Employee数组,我们需要给数组再写入对象的时候就需要是子类了,如:

Java模版方法的小练习——工资系统

这里在SalariedEmolyee这个子类的构造器里new了MyDate对象并调用构造器还是第一次见。。。。

 

具体实现

父类Employee

package com.atguigu.exer;
/*
 * 编写工资系统,实现不同类型员工(多态)的按月发放工资。
 * 如果当月出现某个Employee对象的生日,则将该雇员的工资增加100元。
 * 
 */
abstract public class Employee {
	private String name;
	private int number;
	private MyDate birthday;
	
	public Employee() {
	}
	


	public Employee(String name, int number, MyDate birthday) {
		super();
		this.name = name;
		this.number = number;
		this.birthday = birthday;
	}



	public String getName() {
		return name;
	}

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

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}

	public MyDate getBirthday() {
		return birthday;
	}

	public void setBirthday(MyDate birthday) {
		this.birthday = birthday;
	}
	
	//抽象方法
	public abstract double earning();
	
	public String toString() {
		return("name:" + name + ",number:" + number + ",birthday: " + birthday.toDateString());
	}
}

MyDate类

package com.atguigu.exer;
/*
 * MyDate类包含:
 * private成员变量year,month,day ; 
 * toDateString()方法返回日期对应的字符串:xxxx年xx月xx日
 * 
 */
public class MyDate {
	private int year;
	private int month; 
	private int day;
	
	public MyDate() {
		
	}
	//构造器 似乎没用啊
		public MyDate(int year, int month, int day) {
		super();
		this.year = year;
		this.month = month;
		this.day = day;
	}
	
	public int getYear() {
			return year;
		}

		public void setYear(int year) {
			this.year = year;
		}

		public int getMonth() {
			return month;
		}

		public void setMonth(int month) {
			this.month = month;
		}

		public int getDay() {
			return day;
		}

		public void setDay(int day) {
			this.day = day;
		}

	public String toDateString() {
		return(year + "年" + month + "月" + day + "日");
	}


}

两个子类:

package com.atguigu.exer;
/*
 * (3)定义SalariedEmployee类继承Employee类,
 * 实现按月计算工资的员工处理。
 * 该类包括:private成员变量monthlySalary; 
 * 实现父类的抽象方法earnings(),该方法返回monthlySalary值;
 * toString()方法输出员工类型信息及员工的name,number,birthday。 //其实父类已经写过了
 * 
 * 
 */
public class SalariedEmployee extends Employee{
	private double monthlySalary;
	
	public double getMonthlySalary() {
		return monthlySalary;
	}


	public void setMonthlySalary(double monthlySalary) {
		this.monthlySalary = monthlySalary;
	}


	public SalariedEmployee(String name, int number, MyDate birthday) {
		super(name,number,birthday);
	}

	public SalariedEmployee(String name, int number, MyDate birthday, double monthlySalary) {
		super(name,number,birthday);
		this.monthlySalary = monthlySalary;
	}

	//重写父类方法
	@Override
	public double earning() {
		return(monthlySalary);
	}

	public String toString() {
		//super.toString 是抽象父类的非抽象方法,是可以使用的,而且只能子类使用
		return "SalariedEmployee[" + super.toString() + "]";
	}

}

 

package com.atguigu.exer;
/*
 * 参照SalariedEmployee类定义HourlyEmployee类,
 * 实现按小时计算工资的员工处理。该类包括:
 * 		private成员变量wage和hour; 
 * 		实现父类的抽象方法earnings(),该方法返回wage*hour值; 
 * 		toString()方法输出员工类型信息及员工的name,number,birthday。 
 * 
 * 
 */
public class HourlyEmployee extends Employee{
	private int wage;	//单位小时的工资
	private int hour;	//月工作的小时数
	
	public HourlyEmployee(String name, int number, MyDate birthday) {
		super(name,number,birthday);
	}
	
	public HourlyEmployee(String name, int number, MyDate birthday,int wage,int hour) {
		super(name,number,birthday);
		this.wage = wage;
		this.hour = hour;
	}
	
	public int getWage() {
		return wage;
	}

	public void setWage(int wage) {
		this.wage = wage;
	}

	public int getHour() {
		return hour;
	}

	public void setHour(int hour) {
		this.hour = hour;
	}

	//重写父类方法
	@Override
	public double earning() {
		return wage * hour;
	}
	
	@Override
	public String toString() {
		return "SalariedEmployee[" + super.toString() + "]";
		
	}
}

 

最后是测试类

package com.atguigu.exer;

import java.util.Calendar;
import java.util.Scanner;

/*
 * 定义PayrollSystem类,
 * 创建Employee变量数组并初始化,该数组存放各类雇员对象的引用。
 * 利用循环结构遍历数组元素,输出各个对象的类型,name,number,birthday,以及该对象生日。
 * 当键盘输入本月月份值时,如果本 月是某个Employee对象的生日,还要输出增加工资信息。 
 * 
 * 
 */
public class PayrollSystem {
	public static void main(String[] args) {
		//方式1
//		Scanner scanner = new Scanner(System.in);
//		System.out.println("输入月份:");
//		int month = scanner.nextInt();
		
		//方式2
		Calendar calendar = Calendar.getInstance();
		int month = calendar.get(Calendar.MONTH);	//获取当前月份 一月份是0
		
		
		//栈里有个emps,指向堆空间里的Employee数组,只是创建了Employee类型的数组,不是造对象
		Employee[] emps = new Employee[2];
		
		//关于MyDate这里直接用了构造器,好家伙,我直接好家伙
		//多态性
		emps[0] = new SalariedEmployee("马森", 1002, new MyDate(1992,11,28),10000);
		emps[1] = new HourlyEmployee("潘雨生", 2001, new MyDate(1991,1,6),50,100);
		
		for(int i =0;i < emps.length;i++) {
			System.out.println(emps[i]);
			System.out.println("月工资为:" + emps[i].earning());
			
			if(month+1 == emps[i].getBirthday().getMonth()) {
				System.out.println("生日快乐!奖励100元");
			}
			
		}

		
		

	}
}

 

本文地址:https://blog.csdn.net/weixin_43444660/article/details/109637220

相关标签: java 设计模式