题目要求:编写一个Java程序:
(1)设计一个abstract类Employee,其中有一个abstract方法earnings();
(2)设计Employee的二个子类YearWorker和MonthWorker,分别对应按年领取薪水(年薪为100000元)、按月领取薪水(月薪为5000元),子类必须重写父类的earnings()方法;
(3)设计一个Company类,该类用Employee对象数组作为成员,Employee对象数组中的元素可以是YearWorker对象或MonthWorker对象的上转型对象;
(4)编写一个测试类,假设某公司共有10名员工,两种类型的员工各为5人(其中数组下标为奇数的员工为MonthWorker,其他为YearWorker),计算并输出该公司一年需要支付的薪水总额。
实现效果视频:【Java】类继承机制(实验 上转型对象)_哔哩哔哩_bilibili
思路构建:1.先定义抽象类Employee,里面只声明一个抽象方法earnings。
2.接着定义两个子类YearWorker和MonthWorker,里面分别加入构造函数,并重定义earnings方法。
3.设计Company类,类内定义一个Employee对象数组和一个i,i用来定位对象数组的元素位置,接着写构造函数,然后定义一个int类型的getMoney函数,返回第i个对象数组元素的earnings值。
4.定义测试类,先创建一个长度为10的Employee对象数组,然后用for循环分出奇偶数,将对应的earnings加入总数sum,最后打印出sum值。
抽象类Employee以及抽象方法earnings定义代码如下:
package ex4;
abstract class Employee {
public abstract int earnings();
}
两个子类YearWorker和MonthWorker代码如下:
package ex4;
public class MonthWorker extends Employee{
int month;
MonthWorker(int month){
this.month = month;
}
public int earnings(){
return 5000*month;
}
}
package ex4;
public class YearWorker extends Employee{
int year;
YearWorker(int year){
this.year = year;
}
public int earnings(){
return 100000*year;
}
}
在YearWorker和MonthWorker类中,分别定义了月数和年数,接着编写构造函数,接受传来的参数year和month,最后重定义earnings方法,返回月薪x月数,年薪x年数。
Company类代码如下:
package ex4;
public class Company {
Employee[] e;
int i;
Company(Employee[] ex,int i){
this.e = ex;
this.i = i;
}
public int getMoney(){
return e[i].earnings();
}
}
用i来定位Employee对象数组的下标,接着定义getMoney()方法,返回对应数组的薪水。
测试类test代码如下:
package ex4;
public class test {
public static void main(String[] args) {
Employee[] em = new Employee[10];
Company com;
int i,sum=0;
for(i=0;i<10;i++){
if(i%2==0){
em[i] = new YearWorker(1);
}
else {
em[i] = new MonthWorker(12);
}
com = new Company(em,i);
sum += com.getMoney();
}
System.out.println("该公司一年需要支付的薪水总额为:"+sum);
}
}
由于是计算一年公司需要支付的薪水总额,所以对应的年数为1,月数为12,然后由题意当数组下标为奇数时按月计算薪水,偶数时按年计算薪水,每次累加到sum总值中,最后输出sum得到薪水总额。