Powerpoint Slides - Purdue University

advertisement
Inheritance and Polymorphism
Recitation – 10/(16,17)/2008
CS 180
Department of Computer Science,
Purdue University
Project 5



Due Wed, Oct. 22 at 10 pm.
All questions on the class newsgroup.
Make use of lab consulting hours to clarify
all questions
Overloading of Methods and
Constructors

Def. Overloading

The ability to allow different methods or
constructors of a class to share the same
name.
constructor
overloading
public class Point {
public Point() { /* … */ }
public Point(int x, int y) { /* … */ }
public double distance(Point other) { /* … */ }
public double distance(int x, int y) { /* … */ }
public double distance() { /* … */ }
// …
}
method
overloading
Overloading (Cont.)

Which overloaded method to invoke?

Resolved at compile-time with signature matching,
where signature is name and parameter types.
Constructors/Methods
1: Point()
2: Point(int x,int y)
3: double distance(Point other)
4: double distance(int x,int y)
5: double distance()
Point p1 = new Point();
// which constructor?
Point p2 = new Point(10,20);
p2.distance(p1);
// which method?
p2.distance(20,30);
p2.distance();
When to Overload?

When there is a common description of the
functionality that fits all the overloaded
methods.
public class String {
public String substring(int i, int j) {
// base method: return substring from index i to j - 1.
}
public String substring(int i) {
// provide default argument
return substring(i, length());
}
// …
}
Inheritance




Inheritance models the is-a
relationship.
If class S extends class T, then all
objects of S can act-like an object of T.
Only single inheritance is allowed
among classes.
All public and protected members of a
superclass are accessible in the
subclasses.
Inheritance Contd.





we can build class hierarchies using the
keyword extends
each child (subclass) inherits all the data and
methods of its parent (superclass)
we can add new methods in the subclass, or
override the inherited methods
private data and methods are inherited, but
cannot be accessed directly; protected data
and methods can be accessed directly
constructor methods must be invoked in the
first line in a subclass constructor as a call to
super
Inheritance Example



Class C is a subclass of class B (its
superclass) if its declaration has the form
class C extends B {
…
}
The subclass extends properties and
methods from superclass
The superclass is a generalization of the
subclass
Subclass Constructors

When a subclass is created, java will call
the superclass constructor first




super(..) must be the first statement in
subclass constructor
If the superclass constructor is missing, then a
no-arg super() is invoked implicitly
It is advised to have a default constructor
defined in every class so as to be accessed by
subclass constructor
Can also invoke another constructor of the
same class.

this(…) must be the first statement.
Example of “super” Calls


The call to super must be the first
statement in the subclass constructor
Example:
class C extends B {
…
public C ( … ) {
super(B’s constructor args );
…
}

You must use the keyword super to call the
superclass constructor. Invoking a
superclass constructor’s name in a
subclass causes a syntax error.
Example on the Impact of a Superclass
without no-arg Constructor
Find the errors in the program?

public class Apple extends Fruit {
}
class Fruit {
public Fruit(String name) {
System.out.println("Fruit's constructor
is
invoked");
}
}

There is no default constructor in superclass
Example of “this” Calls
public class Point
{ private int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public Point() { // default constructor
this(0, 0);
}
}
this calls are used to
avoid repeating code
Execution Order of Constructors
Rule: Superclass first and field initialization first
Example: S x = new S();
public class S extends T public class T {
{
int x = 10; // first
int y = 30; // third
public T() {
public S( ) {
x = 20; // second
super();
}
y = 40; // fourth
// ...
}
}
}
Overriding Methods

Def. Overriding


Refers to the introduction of an instance
method in a subclass that has the same name,
signature, and return type of a method
declared in the superclass.
Consequences

Implementation of the method in the subclass
replaces the implementation of the method in
the superclass
Overriding Methods (Cont.)
public class Person {
public void writeOutput() { … }
}
public class Student extends Person {
public void writeOutput() { … }
}
Person p = new Person();
Student s = new Student();
p.writeOutput(); // invoke method of class Person
s.writeOutput(); // invoke method of class Student
Calling Overriden Methods of
Superclass


super can be used to call a method in the
base class that has been overridden in the
derived class.
Example




super.writeOutput();
The above line in the Student class would call the
overridden writeOutput() method in the Person
class.
This need not be the first line of code.
You cannot use super to invoke a method
in some ancestor class other than the
immediate base (parent) class.
Overriding Methods (Cont.)

Dynamic dispatch (binding): The method to be
invoked is determined at runtime by the runtime
type of the object, not by the declared type (static
type).
class Student {
public int maxCredits() { return 15; }
…
}
class GraduateStudent extends Student {
public int maxCredits() { return 12; }
…
}
Student s, s1;
s = new Student();
s.getMaxCredits(); // which maxCredits method?
s1 = new GraduateStudent();
S1.getMaxCredits(); // which maxCredits method?
The final Modifier

You can prevent a method definition from
being overridden by adding the word final
to the method heading.

example
public final void someMethod()
{
…
}

The method someMethod() will not be
overridden in any sub-class.
Overloading Vs. Overriding
public class Test {
public static void main(String[] args) {
A a = new A();
a.p(10);
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
a.p(10);
}
}
class B {
public void p(int i) {
}
}
class B {
public void p(int i) {
}
}
class A extends B {
class A extends B {
// This method overrides the method in B //This method overloads method in B
public void p(int i) {
public void p(double i) {
System.out.println(i);
System.out.println(i);
}
}
}
}
Polymorphism



Polymorphism allows a variable to refer to
objects from different (but related by
inheritance) classes.
References to data or methods are
correctly resolved according to the object’s
class.
Requires that the superclass have the
inherited data or method
Student with two subclasses
Student
We will define three classes:
NUM_OF_TESTS
3
Student
courseGrade
setTestScore
name
getTestScore
test[ ]
GraduateStudent
computeGrade
Student
GraduateStudent
UndergraduateStudent
Implementation of
computeGrade is unique
to each subclass.
…
UndergraduateStudent
computeGrade
Creating the roster Array
Student
roster[ ] = new Student[40];
roster[0]
roster[1]
roster[2]
roster[3]
roster
GraduateStudent
=
=
=
=
new
new
new
new
GraduateStudent( );
UndergraduateStudent( );
UndergraduateStudent( );
GraduateStudent( );
0
UndergraduateStudent
1
2
UndergraduateStudent
3
4
GraduateStudent
roster is an array of
Student objects.
Create instances of
the subclasses
Create
instancesofof
Student.
(An object
of
the
subclasses
of
a derived class can
Student.
serve as an object of
base class - Vice
versa is WRONG)
36 37 38 39
Processing the roster Array
for (int i = 0; i < numberOfStudents; i++ ) {
roster[i].computeGrade( );
}
 Notice how the polymorphism is used above. The
particular computeGrade() method to be called is
dependent on value of i (dynamic binding)
 If roster[i] refers to a GraduateStudent, then the
computeCourseGrade method of the GraduateStudent
class is executed.
 If roster[i] refers to an UndergraduateStudent, then the
computeCourseGrade method of the
UndergraduateStudent class is executed.
Static and Dynamic Binding


Binding: determining the memory
addresses for jumps
Static: done at compile time



Dynamic: done at run time
Compilation is done offline



also called offline
it is a separate operation done before running
a program
Binding done at compile time is, therefore,
static
Binding done at run time is dynamic

also called late binding
Abstract Classes





Often we want to place elements common to all
subclasses in their superclass
But we do not want any instances to be created
from the superclass
In such case, we designate the superclass as an
abstract class.
This is also a way to enforce existence of
methods in subclasses.
Abstract classes are only used as super classes
Abstract Methods




Abstract methods have no body at all and just
have their headers declared
The only way to use an abstract class is to create
a subclass that implements each abstract method
It is common for an abstract class to include an
abstract method that must be implemented by the
sub classes.
If a class includes an abstract method, then it is
considered as an abstract class and must have
the abstract modifier in the class declaration.
Sample Abstract Class
abstract class Student
{
. . .
abstract public void computeGrade( );
. . .
}
class GraduateStudent extends Student
{
. . .
public void computeGrade( )
{
//method body comes here
}
. . .
}
Reserved word
abstract in the class
declaration.
Abstract method has
no method body.
Abstract method must
be fully implemented
in the derived class.
Interfaces

An interface specifies the headings for
methods that must be defined for any class
that implements the interface.

Example -
Interfaces Contd.


A class that implements an interface must
implement all the methods specified by the
interface.
To implement an interface, a class must
 include the phrase
implements Interface_Name
at the start of the class definition
example
class CS180 implements Writable {…}


implement all the method headings listed
in the definition of the interface.
Abstract Class vs. Interface

Abstract classes are blueprints, interfaces are
contracts


Interface: “Here’s some methods. If your class
implements this interface, you must provide an
implementation of each method in the interface in the
class.”



Method headers
A class can implement multiple interfaces
Cannot instantiate





Abstract method headers
Methods
Variables
A class can extend only one class
Cannot instantiate
Abstract class: “Here’s a blueprint for a class. If your
class extends this abstract class, you can use any
functionality here and add onto it, but you must fill in
what I have not.”
Quiz – Print the Output
class Shape {
void draw() {} }
class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
}
class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
}
class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
}
Shape[] s = new Shape[9];
// Fill up the array with shapes:
for(int i = 0; i < s.length; i++)
{ if(i%2==0)
s[i] = new Circle();
else if (i%3==0)
s[i] = new Square();
else
s[i] = new Traingle();
}
// Make polymorphic method
calls:
for(int i = 0; i < s.length; i++)
s[i].draw();
}
Download