CS 1101-03 Programming and Problem Solving: Fall 2016
CS 1101-03 Programming and Problem Solving: Fall 2016
Fall 2016
Terminology
A class from which other classes are derived. The
Base class is ?? derived classes inherit properties of the base class.
Copyright © 2010
An Object Can Have More than One Type
class Person{ We can have:
private String name;
……
void printMe (){
System.out.println (“Person.”)
}
Poly = "many"
This is known as Polymorphism Morph = "shape"
Copyright © 2010
And so what ?
Example of one situation where polymorphism is useful:
We want to keep everybody in the same
array structure for easy access.
But we should have only one type in an
array… so this is where polymorphism
comes to play:
Copyright © 2010
An Object Can Have More than One Type
class Person{ What is the output ?
private String name;
……
void printMe (){
System.out.println (“Person.”)
}
class Student extends Person{
private int stdNb;
……
void printMe (){
System.out.println (“Student.”)
}
class Undergraduate extends Student{ Java will chooses the true type: the object
private int level; that actually gets created. In this example,
…… what we are really creating are a Person, a
void printMe (){ Student and an UnderGrad, even though we
System.out.println (“UndGrad.”)
}
are referencing all variables as a Person.
Dynamic Binding:
Different objects can invoke different method definitions using the same method name.
Warning:
Student s = new Student();
Person p = s; //p has only access to methods of the class Person
Copyright © 2010
Which method are actually invoked ?
Class Person can call: Class Undergraduate can call:
• Its own constructor • Its own constructor
• setName(String) • setName(string)
• getName() • getName()
• toString() • getStudentNumber()
• equals(Object) • setStudentNumber(int)
• reset(String, int)
• getlevel()
Class Student can call: • setLevel(int)
• Its own constructor • reset(String, int, int)
• setName(String) • toString()
• getName() • equals(Object)
• getStudentNumber()
• setStudentNumber(int)
• reset(String, int)
• toString()
• equals(Object)
Copyright © 2010
Which method are actually invoked ?
Class Person can call: Class Undergraduate can call:
• Its own constructor • Its own constructor
• setName(String) • setName(string)
• getName() • getName()
• toString() • getStudentNumber()
• equals(Object) • setStudentNumber(int)
• reset(String, int)
• getlevel()
Class Student can call: • setLevel(int)
• Its own constructor • reset(String, int, int)
• setName(String) • toString()
• getName() • equals(Object)
• getStudentNumber()
• setStudentNumber(int) Inherited from ancestor class
• reset(String, int)
• toString()
Person: these methods are only
• equals(Object) written once!
Copyright © 2010
Which method are actually invoked ?
Class Person can call: Class Undergraduate can call:
• Its own constructor • Its own constructor
• setName(String) • setName(string)
• getName() • getName()
• toString() • getStudentNumber()
• equals(Object) • setStudentNumber(int)
• reset(String, int)
• getlevel()
Class Student can call: • setLevel(int)
• Its own constructor • reset(String, int, int)
• setName(String) • toString()
• getName() • equals(Object)
• getStudentNumber()
• setStudentNumber(int) Inherited from super class
• reset(String, int)
• toString()
Student: these methods are
• equals(Object) only written once!
Note: they are not available for
Copyright © 2010
a Person type.
Which method are actually invoked ?
Class Person can call: Class Undergraduate can call:
• Its own constructor • Its own constructor
• setName(String) • setName(string)
• getName() • getName()
• toString() • getStudentNumber()
• equals(Object) • setStudentNumber(int)
• reset(String, int)
• getlevel()
Class Student can call: • setLevel(int)
• Its own constructor • reset(String, int, int)
• setName(String) • toString()
• getName() • equals(Object)
• getStudentNumber()
• setStudentNumber(int) Only Undergraduate types can call
• reset(String, int)
• toString()
reset(String, int, int) getLevel()
• equals(Object) and setLevel(int). They’re the
only one’s with a copy.
The overloaded version of reset
Copyright © 2010
Which method are actually invoked ?
Class Person can call: Class Undergraduate can call:
• Its own constructor • Its own constructor
• setName(String) • setName(string)
• getName() • getName()
• toString() • getStudentNumber()
• equals(Object) • setStudentNumber(int)
• reset(String, int)
• getlevel()
Class Student can call: • setLevel(int)
• Its own constructor • reset(String, int, int)
• setName(String) • toString()
• getName() • equals(Object)
• getStudentNumber()
• setStudentNumber(int) toString() and equals are
• reset(String, int)
• toString()
overriden.
• equals(Object) Version called depends on the
object making the call.
Copyright © 2010
And so what (again)?
Elaborate on this situation:
Person [ ] university = new Person [10000];
university [0] = new Student();
university [1] = new Student();
We have a mix of
….
university[1000] = new Doctoral();
types in the
…. same array.
university [8000] = new Employee();
…etc.
Copyright © 2010
A Polymorphism Problem
Assume that the following four classes have been declared:
public class Foo {
public void method1() {
System.out.println("foo 1"); }
public class Bar extends Foo { public class Baz extends Foo {
public void method2() { public void method1() {
System.out.println("bar 2"); } System.out.println("baz 1"); }
}
public String toString() {
return "baz"; }
}
Output:
foo
foo 1
foo 2
foo
foo 1
bar 2
baz
baz 1
foo 2
baz
baz 1
mumble 2
Copyright © 2010
Diagramming the Classes
• Add classes from top (superclass) to bottom (subclass)
• Include all inherited methods
Copyright © 2010
Finding Output with Tables
Copyright © 2010
Inheritance
• With class inheritance, we saw we could create
polymorphic objects
o An object could act as many different types
o An Undergraduate object could also act as a Student
object or a Person object
o The type of the actual object determined which
version of overridden methods were executed
• Sometimes we want to have this ability of
different classes overriding methods, but do not
want/need the capabilities of full inheritance
• Class interfaces fill this need
Interface – example.
Consider this hierarchy of 2D objects.
We know each object will have
Shape - An inside color
- A position
- A type of outline
Class - Some dimensions…etc.
Class Circle - A perimeter
Polygon
- An area…etc.
• The formula to calculate perimeter and area
Class Class will vary with the type of figure.
Triangle Rectangle • We can override these methods…
• In the class Shape these methods will be
empty…
/**
An interface for methods that return
the perimeter and area of an object
*/
public interface Shape { Uses the interface keyword
/** Returns the perimeter */
public double getPerimeter(); Methods are not implemented
/** Returns the area */
public double getArea();
A way to say: “all my descendants
} will have these methods.
Copyright © 2010
Java Interfaces
• By convention, interface names begin with uppercase letter (just
like classes)
• Stored in a file with suffix .java (just like classes)
• Interfaces do not include:
o Declarations of constructors
o Instance variables
o Method bodies
• To implement an interface, a class must:
o Include the phrase: implements InterfaceName
o Provide a definition each specified method
o The class can include instance variables and additional methods
Interface Example
public interface Shape {
public double getPerimeter();
public double getArea();
}
/** /**
A class of rectangles. A class of circles.
*/ */
public class Rectangle implements Shape { public class Circle implements Shape {
private double myWidth; private double myRadius;
private double myHeight;
public Circle(double radius) {
public Rectangle(double width, double height) { myRadius = radius;
myWidth = width; }
myHeight = height;
} public double getPerimeter() {
return getCircumference();
public double getPerimeter() { }
return 2 * (myWidth + myHeight);
} public double getCircumference() {
return 2 * Math.PI * myRadius;
public double getArea() { }
return myWidth * myHeight;
} public double getArea() {
return Math.PI * myRadius * myRadius;
// not shown: setWidth, getWidth, etc. }
} // not shown: setRadius, getRadius, etc.
}
An Interface as a Type
• Possible to write a method that has an interface
type as a parameter
• An interface is a reference type, just like a class
• You can then call the method passing it an object of
any class which implements that interface
• Interfaces provide us with another form of
polymorphism but without the need for an inheritance
hierarchy
• Objects share some common behavior without
sharing any common data
An Interface as a Type
public static void display(Shape figure) {
double perim = figure.getPerimeter();
double area = figure.getArea();
System.out.println("Perimeter is " + perim +
"; area is " + area);
}