public class Firm {
public static void main(String[] args) {
Staff personnel = new Staff();
personnel.payday();
}
}
// -------------------------------------------------------------------------
class Staff {
private StaffMember[] staffList;
public Staff() {
staffList = new StaffMember[6];
staffList[0] = new Executive("Tony", "123 Main Line", "555-0469", "123-45-6789", 12423.07);
staffList[1] = new Employee("Paulie", "456 Off Line", "555-0101", "987-65-4321", 1246.15);
staffList[2] = new Employee("Vito", "789 Off Rocker", "555-0000", "010-20-3040", 1169.23);
staffList[3] = new Hourly("Michael", "678 Fifth Ave.", "555-0690", "958-47-3625", 10.55);
staffList[4] = new Volunteer("Adrianna", "987 Babe Blvd.", "555-8374");
staffList[5] = new Volunteer("Benny", "321 Dud Lane", "555-7282");
if (staffList[0] instanceof Executive) {
((Executive) staffList[0]).awardBonus(1500);
}
if (staffList[3] instanceof Hourly) {
((Hourly) staffList[3]).addHours(40);
}
}
public void payday() {
double totalAmount = 0;
System.out.println(
"------------------------------------------------------------------------------------------------------------");
System.out.printf("%-6s %-12s %-12s %-12s %-12s %-12s %-30s\n",
"No.", "Paid", "Name", "SSN", "Phone", "Note", "Address");
System.out.println(
"------------------------------------------------------------------------------------------------------------");
for (int i = 0; i < staffList.length; i++) {
double amount = staffList[i].pay();
totalAmount += amount;
// 调用重写后的 toString() 自动补全剩余列
System.out.printf("%03d %, 12.2f %s\n", (i + 1), amount, staffList[i].toString());
}
System.out.println(
"------------------------------------------------------------------------------------------------------------");
System.out.printf("GRAND TOTAL PAID: %,.2f\n", totalAmount);
System.out.println(
"------------------------------------------------------------------------------------------------------------");
}
}
// -------------------------------------------------------------------------
abstract class StaffMember {
private String name, address, phone;
public StaffMember(String name, String address, String phone) {
this.name = name;
this.address = address;
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public abstract String getSsn();
public abstract double pay();
@Override
public String toString() {
return String.format("%-10s %-15s %-12s %-12s %-30s",
name, getSsn(), phone, getClass().getSimpleName(), address);
}
}
// -------------------------------------------------------------------------
class Volunteer extends StaffMember {
public Volunteer(String name, String address, String phone) {
super(name, address, phone);
}
@Override
public String getSsn() {
return "N/A";
}
@Override
public double pay() {
return 0;
}
}
// -------------------------------------------------------------------------
class Employee extends StaffMember {
private String ssn;
private double payRate;
public Employee(String name, String address, String phone, String ssn, double payRate) {
super(name, address, phone);
this.ssn = ssn;
this.payRate = payRate;
}
@Override
public String getSsn() {
return ssn;
}
public void setSsn(String ssn) {
this.ssn = ssn;
}
public double getPayRate() {
return payRate;
}
public void setPayRate(double payRate) {
this.payRate = payRate;
}
@Override
public double pay() {
return payRate;
}
}
// -------------------------------------------------------------------------
class Executive extends Employee {
private double bonus;
public Executive(String name, String address, String phone, String ssn, double payRate) {
super(name, address, phone, ssn, payRate);
this.bonus = 0;
}
public double getBonus() {
return bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
public void awardBonus(double bonus) {
setBonus(bonus);
}
@Override
public double pay() {
double payment = super.pay() + bonus;
bonus = 0;
return payment;
}
}
// -------------------------------------------------------------------------
class Hourly extends Employee {
private int hoursWorked;
public Hourly(String name, String address, String phone, String ssn, double payRate) {
super(name, address, phone, ssn, payRate);
this.hoursWorked = 0;
}
public int getHoursWorked() {
return hoursWorked;
}
public void setHoursWorked(int hoursWorked) {
this.hoursWorked = hoursWorked;
}
public void addHours(int moreHours) {
this.hoursWorked += moreHours;
}
@Override
public double pay() {
double payment = getPayRate() * hoursWorked;
hoursWorked = 0;
return payment;
}
}