In: Computer Science
#2 Extend Employee and Manager classes created in lab#3. § Replace field year by the field hireDate of type java.util.Date § Your classes should implement Comparable interface. (Employee1 > Employee2 if its salary is more than the salary of Employee2, the same for managers, but if their salaries are equal, compare by bonus). (java oop)-> laboratory work
lab3# Create a class called Employee whose objects are records
for an employee. This class will be a derived class of the class
Person (MUST contain equals and toString methods). An employee
record has an employee's name (inherited from the class Person), an
annual salary represented as a single value of type double, a year
the employee started work as a single value of type int and a
national insuranceNumber, which is a value of type String. Inside
this class you need to override toString and equals methods of the
Person class. Your class should have a reasonable number of
constructors and accessor methods. Then create a class Manager
extending Employee, each manager has a team of Employees (Vector)
and can get a bonus. You need to override toString and equals
methods. Write another class containing a main method to fully test
your class definition. *Use super() keyword whenever possible.
Otherwise you will lose points. *Check the quality of your equals
and hashcode methods by adding several employees to a HashSet and
checking whether it allows duplicate items.
Person Class
import java.util.Objects;
public class Person {
    protected String name;  // protected so that Employee child class can inherit it.
    public Person() {
    }
    public Person(String name) {
        this.name = name;
    }
    // Equality is based on Name. 2 person with same name is considered same.
    // Question does not mention basis of equality, so this is the default implementation.
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name);
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
     // Accessor Methods
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
Employee Class
import java.util.Objects;
public class Employee extends Person {  // derived class of the class Person. Employee class has inherited name variable from Person class. See Person class.
    double salary; // an annual salary represented as a single value of type double,
    int yearOfStart; // a year the employee started work as a single value of type int
    String nationalInsuranceNumber; //national insuranceNumber, which is a value of type String.
    public Employee() {
    }
    public Employee(double salary) {
        this.salary = salary;
    }
    public Employee(double salary, int yearOfStart) {
        this.salary = salary;
        this.yearOfStart = yearOfStart;
    }
    public Employee(String name,double salary, int yearOfStart, String nationalInsuranceNumber) {
        super(name);
        this.salary = salary;
        this.yearOfStart = yearOfStart;
        this.nationalInsuranceNumber = nationalInsuranceNumber;
    }
    @Override
    public String toString() {
        return "Employee{" +
                "salary=" + salary +
                ", yearOfStart=" + yearOfStart +
                ", nationalInsuranceNumber='" + nationalInsuranceNumber + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (!super.equals(o)) return false;
        Employee employee = (Employee) o;
        return Double.compare(employee.salary, salary) == 0 &&
                yearOfStart == employee.yearOfStart &&
                Objects.equals(nationalInsuranceNumber, employee.nationalInsuranceNumber);
    }
    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), salary, yearOfStart, nationalInsuranceNumber);
    }
    // Accessor Methods
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public int getYearOfStart() {
        return yearOfStart;
    }
    public void setYearOfStart(int yearOfStart) {
        this.yearOfStart = yearOfStart;
    }
    public String getNationalInsuranceNumber() {
        return nationalInsuranceNumber;
    }
    public void setNationalInsuranceNumber(String nationalInsuranceNumber) {
        this.nationalInsuranceNumber = nationalInsuranceNumber;
    }
}