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
2 errors