Example: A Payroll Application

Demonstrated Concepts

derived classes

inheritance

redefining inherited methods

public, private, & protected members

constructors

getters & setters

safe arrays

UML class diagrams

polymorphism (i.e., virtual methods, dynamic binding)

abstract methods and classes

UML Class Diagram

Employee

class Employee
{
   public Employee(String nm, String num, double sal)
   {
      name = nm;
      ssn = num;
      salary = sal;
   }

   public Employee(String nm, String num)
   {
      name = nm;
      ssn = num;
      salary = 0;
   }

   public String getName() { return name; }
   public String getSSN() { return ssn; }
   public double getSalary() { return salary; }
   public void setSalary(double sal) { salary = sal; }

   public void println()
   {
      System.out.println("Name       = " + name);
      System.out.println("SSN          = " + ssn);
      System.out.println("Salary       = $" + salary);
   }

   protected String name, ssn;
   protected double salary;
}

Company

class Company
{
   public Company(String nm, String addr)
   {
      name = nm;
      address = addr;
      staffSize = 0;
      MAX_STAFF_SIZE = 100;
      staff = new Employee[MAX_STAFF_SIZE];
   }

   public void hire(Employee emp)
   {
      if (staffSize < MAX_STAFF_SIZE)
         staff[staffSize++] = emp;
      else
         System.err.println("Staff overflow!");
   }

   public double payroll()
   {
      double total = 0;
      for(int i = 0; i < staffSize; i++)
         total += staff[i].getSalary();
      return total;
   }

   public void println()
   {
      System.out.println("Company name = " + name);
      System.out.println("Company address = " + address);
      System.out.println("# of employees = " + staffSize);
      System.out.println("payroll = $" + payroll());
      System.out.println("Staff:");
      for(int i = 0; i < staffSize; i++)
      {
         staff[i].println();
         System.out.println("++++++++++++++++++++++++");
      }
   }
   
   private String name;
   private String address;
   private int staffSize;
   private int MAX_STAFF_SIZE;
   private Employee[] staff;

 

   // test harness
   public static void main(String[] args)
   {
      Company ibm = new Company("IBM", "123 Sesame St.");

      // add some staff
      Programmer p;
      Manager m;
      Secretary s;

      p = new Programmer("Tod Guff", "111-11-1111", "FORTRAN");
      p.setSalary(30000);
      ibm.hire(p);

      m = new Manager("Mark Flnoy", "123-45-6789", 2);
      m.setSalary(100000);
      s = new Secretary("Kip Scout", "999-11-2345", 60);
      s.setSalary(20000);
      m.setSecretary(s);
      ibm.hire(s);
      ibm.hire(m);

      p = new Programmer("Inky Martindale", "888-88-8888", "LISP");
      p.setSalary(31000);
      ibm.hire(p);

      m = new Manager("Pat Cow", "828-28-2828", 3);
      m.setSalary(150000);
      s = new Secretary("Rose Kenedy", "333-33-3333", 30);
      s.setSalary(25000);
      m.setSecretary(s);
      ibm.hire(s);
      ibm.hire(m);

      ibm.println();

   } // main

} // company

Programmer

class Programmer extends Employee
{
   public Programmer(String nm, String num, String lang)
   {
      super(nm, num);
      language = lang;
   }

   public Programmer(String nm, String num)
   {
      super(nm, num);
      language = "unknown";
   }

   public String getLanguage() { return language; }
   public void setLanguage(String lang) { language = lang; }

   public void println()
   {
      super.println(); // call the inherited Employee.println()
      System.out.println("Position    = Programmer");
      System.out.println("Language    = " + language);
   }

   private String language; // principle programming language
}

Manager

class Manager extends Employee
{
   public Manager(String nm, String num, int lev)
   {
      super(nm, num);
      level = lev;
   }

   public Manager(String nm, String num)
   {
      super(nm, num);
      level = 1;
   }

   public int getLevel() { return level; }
   public void setLevel(int lev) { level = lev; }

   public Secretary getSecretary() { return secretary; }
   public void setSecretary(Secretary sec)
   {
      secretary = sec;
      secretary.setBoss(this);
   }

   public void println()
   {
      super.println(); // call the inherited Employee.println()
      if (level == 1)
         System.out.println("Position    = Low-Level Manager");
      else if (level == 2)
         System.out.println("Position    = Mid-Level Manager");
      else if (level == 3)
         System.out.println("Position    = High-Level Manager");
      else
         System.out.println("Position    = Some kind of Manager?");
      System.out.println("Secretary = " + secretary.getName());
   }

   private int level; // 1 = low, 2 = mid, 3 = high
   private Secretary secretary;
}

Secretary

class Secretary extends Employee
{
   public Secretary(String nm, String num, int speed)
   {
      super(nm, num);
      wpm = speed;
   }

   public Secretary(String nm, String num)
   {
      super(nm, num);
      wpm = 0;
   }

   public int getWPM() { return wpm; }
   public void setWPM(int speed) { wpm = speed; }

   public Manager getBoss() { return boss; }
   public void setBoss(Manager man) { boss = man; }

   public void println()
   {
      super.println(); // call the inherited Employee.println()
      System.out.println("Position    = Secretary");
      System.out.println("Typing speed = " + wpm + " wpm");
      System.out.println("Boss         = " + boss.getName());
   }

   private int wpm; // typing speed in words/minute
   private Manager boss;
}

Program Output

C:\Pearce\Java\Projects>javac Company.java

C:\Pearce\Java\Projects>java Company
Company name = IBM
Company address = 123 Sesame St.
# of employees = 7
payroll = $556000.0
Staff:
Name = Tod Guff
SSN = 111-11-1111
Salary = $30000.0
Position = Programmer
Language = FORTRAN
++++++++++++++++++++++++
Name = Kip Scout
SSN = 999-11-2345
Salary = $20000.0
Position = Secretary
Typing speed = 60 wpm
Boss = Mark Flnoy
++++++++++++++++++++++++
Name = Mark Flnoy
SSN = 123-45-6789
Salary = $100000.0
Position = Mid-Level Manager
Secretary = Kip Scout
++++++++++++++++++++++++
Name = Inky Martindale
SSN = 888-88-8888
Salary = $31000.0
Position = Programmer
Language = LISP
++++++++++++++++++++++++
Name = Rose Kenedy
SSN = 333-33-3333
Salary = $25000.0
Position = Secretary
Typing speed = 30 wpm
Boss = Pat Cow
++++++++++++++++++++++++
Name = Pat Cow
SSN = 828-28-2828
Salary = $150000.0
Position = High-Level Manager
Secretary = Rose Kenedy
++++++++++++++++++++++++

C:\Pearce\Java\Projects>

Extending the Payroll Application (Fortune Tellers)

class FortuneTeller extends Employee
{
   public FortuneTeller(String nm, String num, boolean ball)
   {
      super(nm, num);
      hasCrystalBall = ball;
   }

   // forgot to define FortuneTeller.println()

   private boolean hasCrystalBall;
}

IBM creates and hires a new fortune teller

// added to ibm.main()
FortuneTeller f =
   new FortuneTeller("Crispin", "558-92-1343", true);
f.setSalary(200000);
ibm.hire(f);

Program Output

C:\Pearce\Java\Projects>javac Company.java

C:\Pearce\Java\Projects>java Company
Company name = IBM
Company address = 123 Sesame St.
# of employees = 7
payroll = 556000.0
Staff:
Name = Tod Guff
SSN = 111-11-1111
Salary = $30000.0
Position = Programmer
Language = FORTRAN
++++++++++++++++++++++++
Name = Kip Scout
SSN = 999-11-2345
Salary = $20000.0
Position = Secretary
Typing speed = 60 wpm
Boss = Mark Flnoy
++++++++++++++++++++++++
Name = Mark Flnoy
SSN = 123-45-6789
Salary = $100000.0
Position = Mid-Level Manager
Secretary = Kip Scout
++++++++++++++++++++++++
Name = Inky Martindale
SSN = 888-88-8888
Salary = $31000.0
Position = Programmer
Language = LISP
++++++++++++++++++++++++
Name = Rose Kenedy
SSN = 333-33-3333
Salary = $25000.0
Position = Secretary
Typing speed = 30 wpm
Boss = Pat Cow
++++++++++++++++++++++++
Name = Pat Cow
SSN = 828-28-2828
Salary = $150000.0
Position = High-Level Manager
Secretary = Rose Kenedy
++++++++++++++++++++++++
Name = Crispin
SSN = 558-92-1343
Salary = $200000.0
++++++++++++++++++++++++

C:\Pearce\Java\Projects>

Abstract Methods & Classes

abstract class Employee
{
   abstract public void println(); // no implementation!

   protected void printlnHelper()
   {
      System.out.println("Name       = " + name);
      System.out.println("SSN          = " + ssn);
      System.out.println("Salary       = $" + salary);
   }

   // etc.

} // Employee

Modify Secretary.println(), Manager.println(), Programmer.println(), etc.

class Secretary extends Employee
{
   public void println()
   {
      printlnHelper(); // instead of super.println()
      System.out.println("Position    = Secretary");
      System.out.println("Typing speed = " + wpm + " wpm");
      System.out.println("Boss         = " + boss.getName());
   }

   // etc.

} // Secretary

Abstract Classes in UML Class Diagrams

 

Fortune Tellers are abstract, too!

C:\Pearce\Java\Projects>javac Company.java
Company.java:141: class FortuneTeller must be declared abstract. It does not define void println() from class Employee.
class FortuneTeller extends Employee
^
Company.java:243: class FortuneTeller is an abstract class. It can't be instantiated.
new FortuneTeller("Crispin", "558-92-1343", true);
^

2 errors