Top Banner
©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter 13 Inheritance and Polymorphism
59
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

Chapter 13

Inheritance and Polymorphism

Page 2: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

Chapter 13 Objectives

After you have read and studied this chapter, you should be able to• Write programs that are easily

extensible and modifiable by applying polymorphism in program design.

• Define reusable classes based on inheritance and abstract classes and abstract methods.

• Define methods, using the protected modifier.

• Parse strings, using a String Tokenizer object.

Page 3: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance

To explain the concept of inheritance, we will consider an example of a class roster.

The class roster should contain both undergraduate and graduate students.

Page 4: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance

Each student’s record will contain his or her name, three test scores, and the final course grade.

The formula for determining the course grade is different for graduate students than for undergraduate students.

Page 5: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance

There are two broad ways to design the classes to model undergraduate and graduate students.• We can define two unrelated classes,

one for undergraduates and one for graduates.

• We can model the two kinds of students by using classes that are related in an inheritance hierarchy.

Two classes are unrelated if they are not connected in an inheritance relationship.

Page 6: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance

If two objects are expected to share common behaviors and data, it is better to design their classes using inheritance.

Using unrelated classes in such an instance will result in duplicating code common to both classes.

Page 7: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance

For this example, we will design three classes:• Student• UndergraduateStudent• GraduateStudent

The Student class will incorporate behavior and data common to both UndergraduateStudent and GraduateStudent objects.

Page 8: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance

The UndergraduateStudent class and the GraduateStudent class will each contain behaviors and data specific to their respective objects.

Page 9: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance/*File: Student.java*/

class Student {

protected final static int NUM_OF_TESTS = 3;protected String name;protected int[] test;protected String courseGrade;

public Student( ) { this("No Name");}

public Student(String studentName) { name = studentName; test = new int[NUM_OF_TESTS]; courseGrade = "****"; }

Page 10: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritancepublic String getCourseGrade( ) { return courseGrade;}

public String getName( ) { return name;}

public int getTestScore(int testNumber) { return test[testNumber-1];}

public void setName(String newName) { name = newName;}

public void setTestScore(int testNumber, int testScore) {

test[testNumber-1] = testScore; }}

Page 11: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance

The modifier protected makes a data member or method visible and accessible to the instances of the class and the descendant classes.

Public data members and methods are accessible to everyone.

Private data members and methods are accessible only to instances of the class.

Page 12: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance

The UndergraduateStudent and GraduateStudent classes are descendants of the Student class.

A subclass extends its superclass.

Following are the class definitions for the UndergraduateStudent and GraduateStudent classes.

Page 13: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance/*File: UndergraduateStudent.java*/

class UndergraduateStudent extends Student {

public void computeCourseGrade() { int total = 0;

for (int i = 0; i < NUM_OF_TESTS; i++) { total += test[i]; }

if (total / NUM_OF_TESTS >= 70) { courseGrade = "Pass"; } else { courseGrade = "No Pass"; } }

Page 14: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.1 Defining Classes with Inheritance/*File: GraduateStudent.java*/

class GraduateStudent extends Student {

public void computeCourseGrade() { int total = 0;

for (int i = 0; i < NUM_OF_TESTS; i++) { total += test[i]; }

if (total / NUM_OF_TESTS >= 80) { courseGrade = "Pass"; } else { courseGrade = "No Pass"; } }}

Page 15: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

Fig. 13.1

A superclass Student and its subclasses GraduateStudent and UndergraduateStudent.

Page 16: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.2 Using Classes Effectively with Polymorphism

Polymorphism allows a single variable to refer to objects from different classes.

For example, if we declareStudent student;

We can saystudent = new Student();

student = new GraduateStudent();

and student = new UndergraduateStudent();

Page 17: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.2 Using Classes Effectively with Polymorphism

A variable of class X may not refer to an object from the superclass or sibling classes of X.

Sibling classes are those that share the common ancestor class.

Page 18: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.2 Using Classes Effectively with Polymorphism

We can maintain our class roster using an array, combining objects from the Student, UndergraduateStudent, and GraduateStudent classes.

Student roster [40];

roster[0] = new GraduateStudent();

roster[1] = new UndergraduateStudent();

roster[2] = new UndergraduateStudent();

and so on.

Page 19: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

Fig. 13.2

The roster array with elements referring to instances of GraduateStudent or UndergraduateStudent classes.

Page 20: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.2 Using Classes Effectively with Polymorphism

To compute the course grade using the roster array, we execute

for (int i=0; i<numberOfStudents; i++){

roster[i].computeCourseGrade();

}

Page 21: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.2 Using Classes Effectively with Polymorphism

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.

Page 22: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.2 Using Classes Effectively with Polymorphism

The computeCourseGrade method is called polymorphic because the message refers to methods from different classes depending on the object referenced by roster[i].

Polymorphism, as you can see, permits the smooth and easy extension and modification of a program.

Page 23: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.2 Using Classes Effectively with Polymorphism

The instanceof operator can help us learn the class of an object.

Student x = new UndergraduateStudent();

if(x instanceof UndergraduateStudent ){

System.out.println(“Mr. X is an undergraduate student”);

}else{

System.out.println(“Mr. X is a graduate student”);

}

Page 24: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.3 Inheritance and Member Accessibility

In addition to declaring members private and public, we can declare them protected.

The protected modifier is meaningful only if used with inheritance.

Page 25: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.3 Inheritance and Member Accessibility

class Super{

public int public_Super_Field;

protected int protected_Super_Field;

private int private_Super_Field;

public Super(){

public_Super_Field = 10;

protected_Super_Field = 20;

private_Super_Field = 30;

}

...

}

Page 26: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.3 Inheritance and Member Accessibility

class Sub extends Super {

public int public_Sub_Field;

protected int protected_Sub_Field;

private int private_Sub_Field;

public Sub(){

public_Sub_Field = 100;

protected_Sub_Field = 200;

private_Sub_Field = 300;

}

...

}

Page 27: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

Fig. 13.3

A graphical representation of superclasses and subclasses with public, private, and protected members.

Page 28: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.3 Inheritance and Member Accessibility

A public member is accessible to any method.

A private member is accessible only to the methods that belong to the same class.

Page 29: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.3 Inheritance and Member Accessibility

class Client {

public void test(){

Super mySuper = new Super();

Sub mySub = new Sub();

int i = mySuper.public_Super_Field;

int j = mySub.public_Super_Field;

// inherited by mySub

int k = mySub.public_Sub_Field;

}

}

The above three statements are valid.

Page 30: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.3 Inheritance and Member Accessibility

class Client {

public void test(){

Super mySuper = new Super();

Sub mySub = new Sub();

int l = mySuper.private_Super_Field;

int m = mySub.private_Sub_Field;

int n = mySub.private_Super_Field;

}

}

The above three statements are invalid.

Page 31: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.3 Inheritance and Member Accessibility

A protected member is accessible only to the methods that belong to the same class or to the descendant classes.

It is inaccessible to the methods of an unrelated class.

Page 32: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.3 Inheritance and Member Accessibility

class Client {

public void test(){

Super mySuper = new Super();

Sub mySub = new Sub();

int o = mySuper.protected_Super_Field;

int p = mySub.protected_Sub_Field;

int q = mySub.protected_Super_Field;

}

}

The statements above are invalid.

Page 33: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

Fig. 13.4

The difference between public, private, and protected modifiers. Only public members are visible from outside.

Page 34: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

Fig. 13.5

Everything except the private members of the Super class is visible from a method of the Sub class.

Page 35: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.3 Inheritance and Member Accessibility

If a member X, whether inherited or defined in a class, is accessible from an instance of the class, then X is also accessible from all instances of the same class.

Page 36: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

Fig. 13.6

Data members accessible from an instance are also accessible from other instances of the same class.

Page 37: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.4 Inheritance and Constructors

Unlike members of a superclass, constructors of a superclass are not inherited by its subclasses.

You must define a constructor for a class or use the default constructor added by the compiler.

Page 38: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.4 Inheritance and Constructors

A class definition such asClass Person {public void sayHello() {

System.out.println(“Well, hello.”);}

}

is equivalent to Class Person {public Person(){

super();}public void sayHello() {

System.out.println(“Well, hello.”);}

}

Page 39: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.4 Inheritance and Constructors

The statementsuper();

calls the superclass’s constructor.

If the class declaration does not explicitly designate the superclass with the extends clause, then the class’s superclass is the Object class.

Page 40: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.4 Inheritance and Constructors

If you declare a constructor, then no default constructor is added to the class. If you define a class as

class MyClass {

public MyClass(int x){

...

}

}

then a statementMyClass test = new MyClass();

is invalid because MyClass has no matching constructor.

Page 41: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.4 Inheritance and Constructors

If the constructor you define does not contain an explicit call to a superclass constructor, then the compiler adds the statement

super();

as the first statement of the constructor.

Page 42: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.4 Inheritance and Constructors

If a class has a superclass that is not the Object class, then a constructor of the class should make an explicit call to a constructor of the superclass.

Always provide a constructor for every class you define. Don’t rely on default constructors.

Page 43: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

When we define a superclass, we often do not need to create any instances of the superclass.

Depending on whether we need to create instances of the superclass, we must define the class differently.

We will study examples based on the Student superclass defined earlier.

Page 44: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

Example Case 1: Student Must Be Undergraduate or Graduate

If a student must be either an undergraduate or a graduate student, we only need instances of UndergraduateStudent or GraduateStudent.

Therefore, we must define the Student class so that no instances may be created of it.

Page 45: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

An abstract class is a class defined with the modifier abstract. No instances can be created from an abstract class.

Page 46: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

abstract class Student {protected final static int NUM_OF_TESTS = 3;protected String name;protected int[] test;protected String courseGrade;

public Student() {this(“No name”);

}

public Student(String studentName){name = studentName;test = new int[NUM_OF_TESTS];courseGrade = “******”;

}

abstract public void computeCourseGrade();

Page 47: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

public String getCourseGrade(){

return courseGrade;

}

public String getName(){

return name;

}

public int getTestScore(int testNumber) {

return test[testNumber-1];

}

public void setName(String newName){

name = newName;

}

public void setTestScore(int testNumber, int testScore){

test[testNumber-1] = testScore;

}

}

Page 48: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

An abstract method is a method with the keyword abstract, and it ends with a semicolon instead of a method body.

A class is abstract if the class contains an abstract method or does not provide an implementation of an inherited abstract method.

Page 49: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

We say a method is implemented if it has a method body.

If a subclass has no abstract methods and no unimplemented inherited abstract methods, then the subclass is no longer abstract, and instances may be created of it.

An abstract class must contain the keyword abstract in its definition.

Page 50: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

In a program diagram, we represent an abstract class by using the keyword abstract.

Page 51: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

Example Case 2: Student Does Not Have to Be Undergraduate or Graduate.

In this case, we may design the Student class in one of two ways.• We can make the Student class

instantiable. • We can leave the Student class

abstract and add a third subclass, OtherStudent, to handle a student who does not fall into the UndergraduateStudent or GraduateStudent categories.

Page 52: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

With the first approach, we delete the keyword abstract from the class definition and provide a method body for computeCourseGrade.

class Student {...

public void computeCourseGrade(){int total = 0;for (int i=0; i<NUM_OF_TESTS; i++){

total += test[i];}

Page 53: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

if (total/NUM_OF_TESTS >=50){

courseGrade = “Pass”;

}else{

courseGrade = “No Pass”;

}

}

...

}

This design allows us to create an instance of Student to represent a nonregular student.

Page 54: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

In the second approach, we leave the Student class abstract. We define a third subclass, OtherStudent:

class OtherStudent extends Student {public void computeCourseGrade(){

int total = 0;for (int i=0; i<NUM_OF_TESTS; i++){

total += test[i];}if (total/NUM_OF_TESTS >=50){

courseGrade = “Pass”;}else{

courseGrade = “No Pass”;}

}}

Page 55: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

Fig. 13.7

A program diagram of the abstract superclass Student and its three subclasses.

Page 56: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.5 Abstract Superclasses and Abstract Methods

The best approach depends on the particular situation.

When considering design options, we can ask ourselves which approach allows easier modification and extension.

Finally, private methods and static methods may not be declared abstract.

Page 57: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.6 Inheritance versus Interface

Java interface and inheritance both model an IS-A relationship:

class ButtonHandler implements ActionListener

Class SavingsAccount extends Account

We say “ButtonHandler is an ActionListener” and “SavingsAccount is an Account.”

Page 58: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.6 Inheritance versus Interface

However, their uses are very different.

The Java interface is used to share common behavior (only method headers) among the instances of different classes.

Inheritance is used to share common code (including both data members and methods) among the instances of related classes.

Page 59: Chapter13

©TheMcGraw-Hill Companies, Inc. Permission required for reproduction or display.

13.6 Inheritance versus Interface

In your program designs, remember to use the Java interface to share common behavior. Use inheritance to share common code.

If an entity A is a specialized form of another entity B, then model them by using inheritance. Declare A as a subclass of B.