1 of 39

Interfaces and Abstract Classes

CS 240 – Advanced Programming Concepts

2 of 39

Polymorphism

3 of 39

Polymorphism

  • Poly = “many”
  • Morph = “change”
  • Polymorphism = “many forms” (we don’t say many changes)
  • Objects can take on many forms in an object-oriented program
    • The form of the class in which they are declared
    • The form of any parent class in the class’ inheritance hierarchy
    • ‘Object’ is a parent class whether declared or not (always at the top of the inheritance hierarchy)
  • The form is represented by the type of the reference that refers to the object
    • Reference and object types may differ (but must be compatible according to inheritance—’is a’)
  • Simple definition: A reference of one type referring to an object of a different type

4 of 39

Simple Polymorphism Examples

  • Employee emp = new Employee();   OK
  • Person emp = new Employee();        OK
  • Object emp = new Employee();         OK
  • Dog emp = new Employee();            NOT OK

5 of 39

�Result in Memory

Person emp = new Employee();

Although they still exist in memory, ‘hireDate’ and ‘salary’ cannot be accessed from the ‘emp’ reference

6 of 39

Reasons for Polymorphism

  • Reduce dependencies on specific implementations
    • Person emp = new Employee();
    • List list = new ArrayList();
  • Get the same result (reference of one type referring to an object of another type) when you use either of the following:
    • Heterogeneous Collections
      • Collections (such as arrays or ArrayLists) of a parent type that contain children of different types
    • Polymorphic parameters
      • Parameters in a method call that expect a parent reference or object but receive a child of the expected type

7 of 39

Citations

1. Diagrams created by course authors: Ken Rodham and Jerod Wilkerson. 

8 of 39

Polymorphism Example Part 1

The City Simulation Example

9 of 39

City Simulation Example

  • Create a simulation of a city, using an inheritance hierarchy of vehicles
  • Will have different kinds of vehicles in the city that can all ‘go’
  • Will start the simulation by placing vehicles in an array and calling a ‘go()’ method

  • What type of polymorphism is this?

10 of 39

Vehicle Inheritance Hierarchy

11 of 39

Simulation Example 1

public class CitySimulation {

public void run() {

Vehicle [] vehicles = new Vehicle[6];

vehicles[0] = new Car();

vehicles[1] = new Car();

vehicles[2] = new Truck();

vehicles[3] = new Truck();

vehicles[4] = new Boat();

vehicles[5] = new Airplane();

for(int i = 0; i < vehicles.length; i++) {

vehicles[i].go()

}

}

}

12 of 39

Simulation Example Problems

  • No common code to inherit for ‘go()’ method (so what should we write?)
  • Even if there were common code, how would creators of subclasses know they need to override the ‘go() method?
  • Solution: Abstract Method (which requires an Abstract Class)

13 of 39

Citations (Polymorphism Example Part 1)

1. Diagrams created by course authors: Ken Rodham and Jerod Wilkerson. 

14 of 39

Polymorphism Example Part 2

Abstract Classes

15 of 39

Polymorphism Example Problems

  • No common code to inherit for ‘go()’ method (so what should we write?)
  • Even if there were common code, how would creators of subclasses know they need to override the ‘go() method?
  • Solution: Abstract Method (which requires an Abstract Class)

16 of 39

Abstract Vehicle Class

public abstract class Vehicle {

public abstract void go();

}

17 of 39

Abstract Methods

  • Require containing class to be abstract
  • Must be overridden in child classes unless the child is abstract
  • A way to say a class has a behavior that will be defined in the subclasses
  • Allows polymorphic method invocations of methods declared but not defined by the reference type

18 of 39

Polymorphic Method Invocation

  • AKA: Polymorphic Operation

Vehicle v = new Car();

v.go();

  • Allowable because…
    • Every class that has one or more abstract methods must be abstract
    • You can’t create an instance of an abstract class

So,

    • Vehicle references can only refer to vehicle’s non-abstract child classes, so anything a vehicle reference can refer to, will have a non-abstract go() method

Vehicle v = new Vehicle(); Illegal!

19 of 39

Abstract Classes

  • Cannot be instantiated
  • Can be used as reference types (polymorphism)
  • Can be used as array types (polymorphism)
  • May have non-abstract methods
  • Don’t have to have abstract methods
  • Provide a guarantee:
    • If you have a non-null reference of an abstract type, it refers to an object that is not abstract and therefore has non-abstract implementations for all methods

20 of 39

Simulation Example with Abstract Vehicle Class

public class CitySimulation {

public void run() {

Vehicle [] vehicles = new Vehicle[6];

vehicles[0] = new Vehicle(); // Illegal if abstract

vehicles[1] = new Car();

vehicles[2] = new Truck();

vehicles[3] = new Truck();

vehicles[4] = new Boat();

vehicles[5] = new Airplane();

for(int i = 0; i < vehicles.length; i++) {

// Guaranteed to invoke a real (non-abstract) method

vehicles[i].go()

}

}

}

21 of 39

BLANK

22 of 39

Polymorphism Example Part 3

Interfaces

23 of 39

Updated Requirements

  • Simulation must also contain people and dogs

24 of 39

How Do We Start the Simulation Now?

  • Would like the people and dogs to start moving at the same time as the vehicles
  • Can we put ‘Person’ and ‘Dog’ objects in our Vehicle array?
  • Can we change the type of the array to ‘Object’ and then put them in?
  • Need polymorphism (heterogeneous collection) without inheritance

25 of 39

Inheritance Hierarchy with Interfaces

26 of 39

Interfaces

  • Cannot be instantiated
  • Can be used as reference types (polymorphism)
  • Can be used as collection (array) types (polymorphism)
  • May NOT have non-abstract methods
    • All methods are abstract (with three exceptions in recent Java versions)
  • All methods are public (whether you declare them as public or not)
    • With one exception in recent Java versions (9 and later)
  • Provide same guarantee as abstract classes:
    • If you have a non-null reference of an interface type, it refers to an object that implements the interface and is not abstract and therefore has non-abstract implementations for all behaviors (methods)

27 of 39

Interfaces (cont.)

  • Can implement any number of interfaces and still subclass some other class
  • Breaks inheritance barrier of polymorphism
    • Provides a way to use polymorphism where an inheritance relationship does not exist
    • Examples:
      • Moveable m = new Car();
      • Moveable m = new Person();
      • Moveable m = new Dog();
      • Moveable m = new Moveable(); Illegal!
      • Moveable m = new Vehicle(); Illegal!

28 of 39

Interfaces (cont. 2)

  • Can have constant variables
    • All variables are public, static, and final
  • In Java 8 and later:
    • Can have instance methods with bodies (must be declared as default)
      • default void myDefaultMethod() {…}
    • Can have static methods (with bodies)
  • In Java 9 and later:
    • Can have private methods (not inherited so only useful as helper methods to default methods)

29 of 39

Simulation Example with Interface

public class CitySimulation {

public void run() {

Moveable[] moveables = new Moveable[6];

moveables[0] = new Car();

moveables[1] = new Car();

moveables[2] = new Truck();

moveables[3] = new Truck();

moveables[4] = new Person();

moveables[5] = new Dog();

for(int i = 0; i < moveables.length; i++) {

moveables[i].go()

}

}

}

30 of 39

Citations (Polymorphism Example Part 3)

1. Diagrams created by course authors: Ken Rodham and Jerod Wilkerson. 

31 of 39

Creating an Interface

32 of 39

Creating an Interface

public interface Moveable {

    void go();

}

33 of 39

Extending an Interface

public interface MyInterface extends Moveable, Comparable {

    void myMethod();

    void myOtherMethod();

}

  • No single inheritance limit with interfaces
  • Implementing classes must implement all method of the interface and each parent interface or be declared abstract

34 of 39

BLANK

35 of 39

Implementing an Interface

36 of 39

Implementing an Interface

public class Person implements Moveable {

public void go() {

// Code to make person go

}

}

37 of 39

Implementing an Interface with An Abstract Class in Java

public abstract class Vehicle implements Moveable {

}

38 of 39

Extending a Class and Implementing Multiple Interfaces

public class Employee extends Person implements Moveable, Comparable{

public void go() {

// Code to make person go

}

public int compareTo(Object obj) {

// Code to compare two employees

}

}

39 of 39

BLANK