Computer Programming (2)
Chapter 5
Abstract Class
1. Abstract Class
2. Abstract Method
3. Example “Creating Abstract Superclass: Employee class”
4. Extending Concrete Classes
5. Implementing an Abstract Method
Contents
Recommended Reading
1. Java Abstract Classes
[Link]
• Abstract Class
Abstract Class
• Sometimes, it does NOT make sense to create objects from specific
classes.
• In such case, these classes should be created as abstract.
• An abstract class can only be used to derive other classes; you cannot
create objects from an abstract class
• An abstract class must have at least one abstract method.
8-6
Abstract Method
• An abstract method has a complete method heading, to which has been
added the modifier abstract.
• It has no method body and ends with a semicolon in place of its body.
public abstract long getSerNumber();
• An abstract method cannot be private.
• An abstract class can have any number of abstract and/or fully defined
methods.
• A class that has no abstract methods is called a concrete class.
Abstract Class (Cont’d)
• Attempting to instantiate an object of an abstract class is a compilation error.
• Example:
abstract class Shape {
…
}
Shape sh = new Shape();
Abstract Class (Cont’d)
• Failure to implement a superclass’s abstract methods in a subclass is a compilation
error unless the subclass is also declared abstract.
• Example:
abstract class Shape {
public abstract void drawHere();
}
class Rectangle extends Shape {
// The method drawHere() is NOT implemented!
}
Example
• UML Inheritance Diagrams for Abstract Classes
Creating Abstract Superclass: Employee class
• abstract superclass Employee
• earnings is declared abstract
• No implementation can be given for earnings in the Employee abstract class
• An array of Employee variables will store references to subclass objects
• earnings method calls from these variables will call the appropriate version of the
earnings method
The Employee Class Hierarchy
Abstract Class Employee: Outline
// Employee abstract superclass.
public abstract class Employee {
private String firstName;
private String lastName;
private String socialSecurityNumber;
// three-argument constructor
public Employee(String first, String last, String ssn ) {
firstName = first;
lastName = last;
socialSecurityNumber = ssn;
} // end three-argument Employee constructor
Abstract Class Employee: Outline (Cont’d)
public void setFirstName(String first) { firstName = first; }
public String getFirstName() { return firstName; }
public void setLastName( String last ) { lastName = last; }
public String getLastName() { return lastName; }
public void setSocialSecurityNumber( String ssn ) {
socialSecurityNumber = ssn;
}
public String getSocialSecurityNumber() {
return socialSecurityNumber; }
public abstract double earnings(); // no implementation here
} // end abstract class Employee
Extending Concrete Classes
public class SalariedEmployee extends Employee {
private double weeklySalary;
…
// calculate earnings; override abstract method earnings in Employee
public double earnings()
{
return getWeeklySalary();
} // end method earnings
…
}
Extending Concrete Classes (Cont’d)
public class CommissionEmployee extends Employee {
private double grossSales; // gross weekly sales
private double commissionRate; // commission percentage…
// calculate earnings; override abstract method earnings in Employee
public double earnings()
{
return getCommissionRate() * getGrossSales();
} // end method earnings
…
}
Extending Concrete Classes (Cont’d)
public class HourlyEmployee extends Employee {
private double wage; // wage per hour
private double hours; // hours worked for week
// calculate earnings; override abstract method earnings in Employee
public double earnings()
{
if ( getHours() <= 40 ) // no overtime
return getWage() * getHours();
else
return 40 * getWage() + ( getHours() - 40 ) * getWage() * 1.5;
} // end method earnings
Implementing an Abstract Method
• Define the speak() method as abstract in the superclass Animal.
public abstract class Animal {
protected String kind; // Cow, pig, cat, etc.
public Animal() { }
public String toString() {
return "I am a " + kind + " and I go " + speak();
}
public abstract String speak(); // Abstract method
}
• Implement speak() differently in each subclass.
public class Cat extends Animal { public class Cow extends Animal {
public Cat() { public Cow() {
kind = "cat"; kind = "cow";
} }
public String speak() { public String speak() {
return "meow"; return "moo";
} }
} }
Thank You