Abstract Classes
Abstract Classes
Java allows abstract classes
use the modifier abstract on a class header to declare
an abstract class
abstract class Vehicle
{ … }
An abstract class is a placeholder in a class
hierarchy that represents a generic concept
Vehicle
Car Boat Plane
2
Abstract Class: Example
An abstract class often contains abstract
methods, though it doesn’t have to
Abstract methods consist of only methods declarations,
without any method body
public abstract class Vehicle
{
String name;
public String getName()
{ return name; } \\ method body
abstract public void move();
\\ no body!
}
3
Abstract Classes
An abstract class often contains abstract methods,
though it doesn’t have to
Abstract methods consist of only methods declarations,
without any method body
The non-abstract child of an abstract class must
override the abstract methods of the parent
An abstract class cannot be instantiated
(why?)
The use of abstract classes is a design decision; it
helps us establish common elements in a class that is
too general to instantiate
4
Referencing Objects
Recap: Object References
All interaction with an object occurs
through object reference variables
An object reference variable holds the
reference (address, the location) of an
object
ChessPiece bishop1 = new ChessPiece();
bishop1
6
Recap: Primitive Assignment
The act of assignment takes a copy of a
value and stores it in a variable
For primitive types:
num2 = num1;
Before After
num1 num2 num1 num2
5 12 5 5
7
Recap: Reference Assignment
For object references, the reference is
copied:
bishop2 = bishop1;
Before After
bishop1 bishop2 bishop1 bishop2
8
Recap: Relationship Between
Objects and Object References
Two or more references can refer to the
same object; these references are called
aliases of each other
One object (and its data) can be accessed
using different references
9
References and Inheritance
An object reference can refer to an object
of its class, or to an object of any class
derived from it by inheritance
For example, if the Holiday class is used to
derive a child class called Christmas, then a
Holiday reference could actually be used to
point to a Christmas object
Holiday
Holiday day;
day = new Holiday();
…
Christmas
day = new Christmas();
10
References and Inheritance
Assigning an object to an ancestor reference is
considered to be a widening conversion, and can be
performed by simple assignment
Holiday day = new Christmas();
Assigning an ancestor object to a reference can also
be done, but it is considered to be a narrowing
conversion and must be done with a cast
Christmas c1 = new Christmas();
Holiday day = c1;
Christmas c2 = (Christmas) day;
The widening conversion is the most useful
for implementing polymorphism
11
Referencing and Inheritance
Recap: References and Inheritance
An object reference variable can refer to
any object instantiated from
itsown class, or
any class derived from it by inheritance
For example,
Holiday Holiday day;
day = new Holiday();
…
Christmas day = new Christmas();
The assignment of an object of a
derived class to a reference
variable of the base class can be
considered as a widening
conversion 13
References and Inheritance
Through a given type of reference variable,
we can invoke only the methods defined in
that type class Holiday
{
public void celebrate()
{…}
Holiday day; }
day = new Christmas(); class Christmas extends Holiday
{
public void celebrate()
{…}
public void listenToChristmasSongs()
{…}
}
Can we do the following statements:
[Link]();
[Link]();
14
References and Inheritance
We can “promote” an object back to its
original type through an explicit narrowing
cast:
Holiday day = new Christmas();
[Link]();
…
Christmas c = (Christmas) day;
[Link]();
Question: which celebrate() will be invoked by the line:
[Link]();
15
Polymorphism
What is Polymorphism?
A polymorphic reference can refer to different
types of objects at different times
In java every reference can be polymorphic except of
references to base types and final classes.
It is the type of the object being referenced, not
the reference type, that determines which method
is invoked
Polymorphic references are therefore resolved at run-
time, not during compilation; this is called dynamic binding
Careful use of polymorphic references can lead to
elegant, robust software designs
17
Polymorphism
Polymorphism: A polymorphic reference v is declared as class C,
but unless C is final or base type, v can refer to an object of
class C or to an object of any class derived from C.
A method call v.<method_name>(<args>) invokes a method of the
class of an object referred to by v (not necessarily C):
Ex2:
Ex1: void process(Holiday day)
Holiday day = { …
new Christmas(); [Link]();
[Link](); … }
… Christmas day = ...;
process(day)
A very common usage of polymorphism: If classes C1, C2, ....,
Cn are all derived from C, define an array A of elements of C.
The entries A[i] can then refer to objects of classes C1, ...., Cn.
18
The pay-roll of a firm
Staff StaffMember
# name : String
- -staffList:
staffList :staffMemeber[]
StaffMemeber[] # address : String
# phone : String
+ toString() : String
+ payday() : void
+ pay() : double
Method payday() iterates
over elements s of
staffList and calls [Link]()
on each s. Volunteer Employee
# socialSecurityNumber : String
# payRate : double
+ toString() : String
Method payday() also calls + pay() : double + pay() : double
println(s) on each s.
This works because println Executive Hourly
is defined as: - hoursWorked : int
void println(Object o) - bonus : double
+ addHours(moreHours : int) : void
{String s =[Link]()); + toString() : String
+ awardBonus(execBonus : double) : void
[Link](s); + pay() : double + pay() : double
}
19
Single vs. Multiple Inheritance
Some object-oriented languages allow multiple
inheritance, which allows a class to be derived
from two or more classes, inheriting the members
of all parents
The price: collisions, such as the same variable
name, same method name in two parents, have to
be resolved
Java decision: single inheritance, meaning that a
derived class can have only one parent class
20
Interfaces
Java Interface
A Java interface is a collection of constants
and abstract methods
abstract method: a method header without a
method body; we declare an abstract method
using the modifier abstract
since all methods in an interface are abstract,
the abstract modifier is usually left off
Methods in an interface have public visibility
by default
22
Interface: Syntax
interface is a reserved word
public interface Doable
{
public static final String NAME;
public void doThis();
public int doThat();
public void doThis2 (float value, char ch);
public boolean doTheOther (int num);
}
A semicolon immediately
follows each method header
No method in an
interface has a definition (body)
23
Implementing an Interface
A class formally implements an interface by
stating so in the class header in the implements
clause
a class can implement multiple interfaces: the
interfaces are listed in the implements clause,
separated by commas
If a class asserts that it implements an
interface, it must define all methods in the
interface or the compiler will produce errors
24
Implementing Interfaces
public class Something implements Doable
{
public void doThis ()
implements is a
{
reserved word
// whatever
}
public void doThat () Each method listed
{ in Doable is
// whatever given a definition
}
// etc.
}
public class ManyThings implements Doable, AnotherDoable
25
Interfaces: An Example
A class that implements an interface can
implement other methods as well
26
UML Diagram
<<interface>>
Complexity
MiniQuiz + getComplexity () : int
+ setComplexity (int) : void
1
+ main(args : String[]) : void
2 Question
+ getQuestion () : String
+ getAnswer () : String
+ answerCorrect (String) : boolean
+ toString() : String
27
Interfaces: Examples from
Java Standard Class Library
The Java Standard Class library defines many
interfaces:
the Iterator interface contains methods that allow the
user to move through a collection of objects easily
• hasNext(), next(), remove()
the Comparable interface contains an abstract method
called compareTo, which is used to compare two objects
if ([Link](obj2) < 0)
[Link](“obj1 is less than obj2”);
28
Polymorphism via Interfaces
Define a polymorphism reference through
interface
declare a reference variable of an interface type
Doable obj;
the obj reference can be used to point to any object of
any class that implements the Doable interface
the version of doThis depends on the type of object
that obj is referring to:
[Link]();
29
Example: Polymorphism via Interface
The payroll program revisited: we want to
sort the employees by name
30
More Examples
Speaker guest; public interface Speaker
{
guest = new Philosopher(); public void speak();
}
[Link]();
class Philosopher extends Human
guest = Dog(); implements Speaker
[Link](); {
//
public void speak()
{…}
Speaker special; public void pontificate()
special = new Philosopher(); {…}
}
[Link](); // compiler error
class Dog extends Animal implements
Speaker
{
//
Speaker special; public void speak()
{
special = new Philosopher();
…
}
((Philosopher)special).pontificate(); }
31
Interface Hierarchies
Inheritance can be applied to interfaces as well as
classes
One interface can be used as the parent of
another
The child interface inherits all abstract methods
of the parent
A class implementing the child interface must
define all methods from both the parent and child
interfaces
Note that class hierarchies and interface
hierarchies are distinct (they do not overlap)
32