salary

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;
    }
}

 

Scroll to Top