0% found this document useful (0 votes)
7 views60 pages

11slide Accessible

Chapter 11 of 'Introduction to Java Programming and Data Structures' focuses on inheritance and polymorphism in Java. It covers the definition and use of superclasses and subclasses, the invocation of constructors, method overriding, and the concept of polymorphism and dynamic binding. The chapter also discusses casting objects and the use of the instanceof operator to ensure safe type conversions.

Uploaded by

hlmt413
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
7 views60 pages

11slide Accessible

Chapter 11 of 'Introduction to Java Programming and Data Structures' focuses on inheritance and polymorphism in Java. It covers the definition and use of superclasses and subclasses, the invocation of constructors, method overriding, and the concept of polymorphism and dynamic binding. The chapter also discusses casting objects and the use of the instanceof operator to ensure safe type conversions.

Uploaded by

hlmt413
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 60

Introduction to Java Programming and

Data Structures
Twelfth Edition

Chapter 11
Inheritance and
Polymorphism

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Motivations
Suppose you will define classes to model circles,
rectangles, and triangles. These classes have many
common features. What is the best way to design these
classes so to avoid redundancy? The answer is to use
inheritance.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Objectives
11.1 To define a subclass from a superclass through inheritance (§11.2).
11.2 To invoke the superclass’s constructors and methods using the super keyword
(§11.3).
11.3 To override instance methods in the subclass (§11.4).
11.4 To distinguish differences between overriding and overloading (§11.5).
11.5 To explore the toString() method in the Object class (§11.6).
11.6 To discover polymorphism and dynamic binding (§§11.7–11.8).
11.7 To describe casting and explain why explicit downcasting is necessary (§11.9).
11.8 To explore the equals method in the Object class (§11.10).
11.9 To store, retrieve, and manipulate objects in an ArrayList (§11.11).
11.10 To implement a Stack class using ArrayList (§11.12).
11.11 To enable data and methods in a superclass accessible from subclasses using the
protected visibility modifier (§11.13).
11.12 To prevent class extending and method overriding using the final modifier (§11.14).

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Superclasses and Subclasses
GeometricObject
-color: String The color of the object (default: white).
-filled: boolean Indicates whether the object is filled with a color (default: false).
-dateCreated: java.util.Date The date when the object was created.
+GeometricObject() Creates a GeometricObject.
+GeometricObject(color: String, Creates a GeometricObject with the specified color and filled
filled: boolean) values.
+getColor(): String Returns the color.
+setColor(color: String): void Sets a new color.
+isFilled(): boolean Returns the filled property.
+setFilled(filled: boolean): void Sets a new filled property.
+getDateCreated(): java.util.Date
+toString(): String
Returns the dateCreated.
Returns a string representation of this object.
GeometricObject

Circle
-width: double
Rectangle Circle
-radius: double
+Circle() -height: double
+Circle(radius: double) +Rectangle()
+Circle(radius: double, color: String,
filled: boolean)
+Rectangle(width: double, height: double)
+Rectangle(width: double, height: double Rectangle
+getRadius(): double color: String, filled: boolean)
+setRadius(radius: double): void +getWidth(): double
+getArea(): double +setWidth(width: double): void
+getPerimeter(): double
+getDiameter(): double
+getHeight(): double
+setHeight(height: double): void TestCircleRectangle
+printCircle(): void +getArea(): double
+getPerimeter(): double

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Are Superclass’s Constructor Inherited?
No. They are not inherited.
They are invoked explicitly or implicitly.
Explicitly using the super keyword.

A constructor is used to construct an instance of a class. Unlike


properties and methods, a superclass's constructors are not
inherited in the subclass. They can only be invoked from the
subclasses' constructors, using the keyword super. If the
keyword super is not explicitly used, the superclass's no-
arg constructor is automatically invoked.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Superclass’s Constructor Is Always
Invoked
A constructor may invoke an overloaded constructor or its
superclass’s constructor. If none of them is invoked
explicitly, the compiler puts super() as the first statement in
the constructor. For example,

public A() { public A() {


is equivalent to
} super();
}

public A(double d) { public A(double d) {


// some statements is equivalent to
super();
} // some statements
}

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Using the Keyword super
The keyword super refers to the superclass of the class in
which super appears. This keyword can be used in two
ways:
• To call a superclass constructor
• To call a superclass method

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Caution
You must use the keyword super to call the superclass
constructor. Invoking a superclass constructor’s name in a
subclass causes a syntax error. Java requires that the
statement that uses the keyword super appear first in the
constructor.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Constructor Chaining (1 of 2)
Constructing an instance of a class invokes all the superclasses’
constructors along the inheritance chain. This is known as
constructor chaining.
public class Faculty extends Employee {
public static void main(String[] args) {
new Faculty();
}
public Faculty() {
System.out.println("(4) Faculty's no-arg constructor is
invoked");
}
}
class Employee extends Person {
public Employee() {

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Constructor Chaining (2 of 2)
this("(2) Invoke Employee’s overloaded constructor");
System.out.println("(3) Employee's no-arg constructor is
invoked");
}
public Employee(String s) {
System.out.println(s);
}
}
class Person {
public Person() {
System.out.println("(1) Person's no-arg constructor is
invoked");
}
}

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Trace Execution (1 of 9)

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Trace Execution (2 of 9)

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Trace Execution (3 of 9)

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Trace Execution (4 of 9)

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Trace Execution (5 of 9)

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Trace Execution (6 of 9)

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Trace Execution (7 of 9)

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Trace Execution (8 of 9)

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Trace Execution (9 of 9)

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Example on the Impact of a Superclass
Without no-arg Constructor
Find out the errors in the program:
public class Apple extends Fruit {
}
class Fruit {
public Fruit(String name) {
System.out.println("Fruit's constructor is
invoked");
}
}

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Copyright © 2020 Pearson Education, Inc. All Rights Reserved
Defining a Subclass
A subclass inherits from a superclass. You can also:
• Add new properties
• Add new methods
• Override the methods of the superclass

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Calling Superclass Methods
You could rewrite the printCircle() method in the Circle
class as follows:

public void printCircle() {


System.out.println("The circle is created " +
super.getDateCreated() + " and the radius is " + radius);
}

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Overriding Methods in the Superclass
A subclass inherits methods from a superclass. Sometimes it is
necessary for the subclass to modify the implementation of a method
defined in the superclass. This is referred to as method overriding.

public class Circle extends GeometricObject {


// Other methods are omitted

/** Override the toString method defined in


GeometricObject */
public String toString() {
return super.toString() + "\nradius is " + radius;
}
}

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Note (1 of 4)
An instance method can be overridden only if it is
accessible. Thus a private method cannot be overridden,
because it is not accessible outside its own class. If a
method defined in a subclass is private in its superclass,
the two methods are completely unrelated.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Note (2 of 4)
Like an instance method, a static method can be inherited.
However, a static method cannot be overridden. If a static
method defined in the superclass is redefined in a
subclass, the method defined in the superclass is hidden.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Overriding v s Overloading ersu

public class Test { public class Test {


public static void main(String[] args) { public static void main(String[] args) {
A a = new A(); A a = new A();
a.p(10); a.p(10);
a.p(10.0); a.p(10.0);
} }
} }

class B { class B {
public void p(double i) { public void p(double i) {
System.out.println(i * 2); System.out.println(i * 2);
} }
} }

class A extends B { class A extends B {


// This method overrides the method in B // This method overloads the method in B
public void p(double i) { public void p(int i) {
System.out.println(i); System.out.println(i);
} }
} }

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Copyright © 2020 Pearson Education, Inc. All Rights Reserved
Copyright © 2020 Pearson Education, Inc. All Rights Reserved
Copyright © 2020 Pearson Education, Inc. All Rights Reserved
The Object Class and Its Methods
Every class in Java is descended from the java.lang.Object
class. If no inheritance is specified when a class is defined,
the superclass of the class is Object.

public class Circle { public class Circle extends Object {


... Equivalent
...
} }

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Polymorphism
Polymorphism means that a variable of a supertype can
refer to a subtype object.

A class defines a type. A type defined by a subclass is


called a subtype, and a type defined by its superclass is
called a supertype. Therefore, you can say that Circle is a
subtype of GeometricObject and GeometricObject is a
supertype for Circle.

PolymorphismDemo

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Polymorphism, Dynamic Binding and
Generic Programming (1 of 2)

DynamicBindingDemo
Copyright © 2020 Pearson Education, Inc. All Rights Reserved
Polymorphism, Dynamic Binding and
Generic Programming (2 of 2)
An object of a subtype can be used wherever its supertype
value is required. This feature is known as polymorphism.

When the method m(Object x) is executed, the argument


x’s toString method is invoked. x may be an instance of
GraduateStudent, Student, Person, or Object. Classes
GraduateStudent, Student, Person, and Object have their
own implementation of the toString method. Which
implementation is used will be determined dynamically by
the Java Virtual Machine at runtime. This capability is
known as dynamic binding.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Dynamic Binding
Dynamic binding works as follows: Suppose an object o is an instance of
classes C1, C2 ,  , Cn-1, and Cn , where C1 is a subclass of C2 , C2
is a subclass of C3 ,  , and Cn-1 is a subclass of Cn . That is, Cn
is the most general class, and C1 is the most specific class. In Java, Cn
is the Object class. If o invokes a method p, the JVM searches the
implementation for the method p in C1, C2 ,  , Cn-1 and Cn , in this order,
until it is found. Once an implementation is found, the search stops and
the first-found implementation is invoked.

Cn Cn-1 ..... C2 C1

Since o is an instance of C1, o is also an


Object instance of C2, C3, …, Cn-1, and Cn

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Method Matching v s Binding ersu

Matching a method signature and binding a method


implementation are two issues. The compiler finds a
matching method according to parameter type, number of
parameters, and order of the parameters at compilation
time. A method may be implemented in several subclasses.
The Java Virtual Machine dynamically binds the
implementation of the method at runtime.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Generic Programming (1 of 2)
public class class GraduateStudent extends
PolymorphismDemo { Student {
public static void }
main(String[] args) { class Student extends Person {
m(new GraduateStudent()); public String toString() {
m(new Student()); return "Student";
m(new Person()); }
m(new Object()); }
} class Person extends Object {
public static void public String toString() {
m(Object x) { return "Person";
System.out.println(x.toSt }
ring());
}
}
}

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Casting Objects
You have already used the casting operator to convert variables of one
primitive type to another. Casting can also be used to convert an
object of one class type to another within an inheritance hierarchy. In
the preceding section, the statement
m(new Student());
assigns the object new Student() to a parameter of the Object type.
This statement is equivalent to:

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Why Casting Is Necessary?
Suppose you want to assign the object reference o to a variable of the
Student type using the following statement:

Student b = o;

A compile error would occur. Why does the statement Object o = new
Student() work and the statement Student b = o doesn’t? This is
because a Student object is always an instance of Object, but an Object
is not necessarily an instance of Student. Even though you can see that
o is really a Student object, the compiler is not so clever to know it. To
tell the compiler that o is a Student object, use an explicit casting. The
syntax is similar to the one used for casting among primitive data types.
Enclose the target object type in parentheses and place it before the
object to be cast, as follows:

Student b = (Student)o; // Explicit casting


Copyright © 2020 Pearson Education, Inc. All Rights Reserved
Casting From Superclass to Subclass
Explicit casting must be used when casting an object from
a superclass to a subclass. This type of casting may not
always succeed.

Apple x = (Apple)fruit;
Orange x = (Orange)fruit;

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


The instanceof Operator
Use the instanceof operator to test whether an object is
an instance of a class:

Object myObject = new Circle();


... // Some lines of code
/** Perform casting if myObject is an instance of
Circle */
if (myObject instanceof Circle) {
System.out.println("The circle diameter is " +
((Circle)myObject).getDiameter());
...
}

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


TIP
To help understand casting, you may also consider the
analogy of fruit, apple, and orange with the Fruit class as
the superclass for Apple and Orange. An apple is a fruit, so
you can always safely assign an instance of Apple to a
variable for Fruit. However, a fruit is not necessarily an
apple, so you have to use explicit casting to assign an
instance of Fruit to a variable of Apple.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Example: Demonstrating Polymorphism
and Casting
This example creates two geometric objects: a circle, and a
rectangle, invokes the displayGeometricObject method to
display the objects. The displayGeometricObject displays
the area and diameter if the object is a circle, and displays
area if the object is a rectangle.

CastingDemo

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


The equals Method
The equals() method compares the contents of two objects. The default
implementation of the equals method in the Object class is as follows:
public boolean equals(Object obj){
return this == obj;
}

public boolean equals(Object o) {


For example,
the equals if (o instanceof Circle) {
method is return radius ==((Circle)o).radius;
overridden in }
the Circle
else
class.
return false;
}
Copyright © 2020 Pearson Education, Inc. All Rights Reserved
Note (3 of 4)
The == comparison operator is used for comparing two
primitive data type values or for determining whether two
objects have the same references. The equals method is
intended to test whether two objects have the same
contents, provided that the method is modified in the
defining class of the objects. The == operator is stronger
than the equals method, in that the == operator checks
whether the two reference variables refer to the same
object.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


The ArrayList Class
You can create an array to store objects. But the array’s size is fixed
once the array is created. Java provides the ArrayList class that can be
used to store an unlimited number of objects.

java.util.ArrayList<E>
+ArrayList() Creates an empty list.
+add(o: E) : void Appends a new element o at the end of this list.
+add(index: int, o: E) : void Adds a new element o at the specified index in this list.
+clear(): void Removes all the elements from this list.
+contains(o: Object): boolean Returns true if this list contains the element o.
+get(index: int) : E Returns the element from this list at the specified index.
+indexOf(o: Object) : int Returns the index of the first matching element in this list.
+isEmpty(): boolean Returns true if this list contains no elements.
+lastIndexOf(o: Object) : int Returns the index of the last matching element in this list.
+remove(o: Object): boolean Removes the element o from this list.
+size(): int Returns the number of elements in this list.
+remove(index: int) : boolean Removes the element at the specified index.
+set(index: int, o: E) : E Sets the element at the specified index.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Generic Type
ArrayList is known as a generic class with a generic type E.
You can specify a concrete type to replace E when creating
an ArrayList. For example, the following statement creates
an ArrayList and assigns its reference to variable cities. This
ArrayList object can be used to store strings.

ArrayList<String> cities = new ArrayList<String>();

ArrayList<String> cities = new ArrayList<>();

TestArrayList

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Differences and Similarities Between
Arrays and ArrayList
Operation Array ArrayList
Creating an array/ArrayList String[] a = new ArrayList<String> list =
String[10] new ArrayList<>();
Accessing an element a[index] list.get(index);

Updating an element a[index] = "London"; list.set(index,


"London");
Returning size a.length list.size();
Adding a new element Blank

list.add("London");
Inserting a new element Blank
list.add(index,
"London");
Removing an element Blank

list.remove(index);
Removing an element Blank list.remove(Object);

Removing all elements Blank

list.clear();

DistinctNumbers
Copyright © 2020 Pearson Education, Inc. All Rights Reserved
Array Lists from/to Arrays
Creating an ArrayList from an array of objects:

String[] array = {"red", "green", "blue"};


ArrayList<String> list = new
ArrayList<>(Arrays.asList(array));

Creating an array of objects from an ArrayList:

String[] array1 = new String[list.size()];


list.toArray(array1);

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


max and min in an Array List
String[] array = {"red", "green", "blue"};

System.out.pritnln(java.util.Collections.max(
new ArrayList<String>(Arrays.asList(array)));

String[] array = {"red", "green", "blue"};

System.out.pritnln(java.util.Collections.min(
new ArrayList<String>(Arrays.asList(array)));

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Shuffling an Array List
Integer[] array = {3, 5, 95, 4, 15, 34, 3, 6, 5};
ArrayList<Integer> list = new
ArrayList<>(Arrays.asList(array));
java.util.Collections.shuffle(list);
System.out.println(list);

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Stack Animation
https://liveexample.pearsoncmg.com/dsanimation/StackeBook.html

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


The MyStack Classes
A stack to hold objects.

MyStack

MyStack
-list: ArrayList A list to store elements.
+isEmpty(): boolean Returns true if this stack is empty.
+getSize(): int Returns the number of elements in this stack.
+peek(): Object Returns the top element in this stack.
+pop(): Object Returns and removes the top element in this stack.
+push(o: Object): void Adds a new element to the top of this stack.
+search(o: Object): int Returns the position of the first element in the stack from
the top that matches the specified element.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


The protected Modifier
• The protected modifier can be applied on data and
methods in a class. A protected data or a protected
method in a public class can be accessed by any class in
the same package or its subclasses, even if the
subclasses are in a different package.
• private, default, protected, public

Visibility increases

private, none (if no modifier is used), protected, public

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Accessibility Summary
Accessed Accessed
Modifier on Accessed from the Accessed from a
members in from the same from a different
a class same class package subclass package
public
ü
sign

ü
sign

üsign

üsign

protected
üsign

ü
sign

ü
sign Blank

default
ü ü
sign sign Blank Blank

private
ü
sign Blank Blank Blank

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Visibility Modifiers

package p1;
public class C1 { public class C2 {
public int x; C1 o = new C1();
protected int y; can access o.x;
int z; can access o.y;
private int u; can access o.z;
cannot access o.u;
protected void m() {
} can invoke o.m();
} }

package p2;

public class C3 public class C4 public class C5 {


extends C1 { extends C1 { C1 o = new C1();
can access x; can access x; can access o.x;
can access y; can access y; cannot access o.y;
can access z; cannot access z; cannot access o.z;
cannot access u; cannot access u; cannot access o.u;
can invoke m(); can invoke m(); cannot invoke o.m();
} } }

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


A Subclass Cannot Weaken the
Accessibility
A subclass may override a protected method in its
superclass and change its visibility to public. However, a
subclass cannot weaken the accessibility of a method
defined in the superclass. For example, if a method is
defined as public in the superclass, it must be defined as
public in the subclass.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


Note (4 of 4)
The modifiers are used on classes and class members
(data and methods), except that the final modifier can also
be used on local variables in a method. A final local variable
is a constant inside a method.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved


The final Modifier
• The final class cannot be extended:

final class Math {


...
}

• The final variable is a constant:


final static double PI = 3.14159;
• The final method cannot be overridden by its
subclasses.
Copyright © 2020 Pearson Education, Inc. All Rights Reserved
Copyright

This work is protected by United States copyright laws and is


provided solely for the use of instructors in teaching their
courses and assessing student learning. Dissemination or sale of
any part of this work (including on the World Wide Web) will
destroy the integrity of the work and is not permitted. The work
and materials from it should never be made available to students
except by instructors using the accompanying text in their
classes. All recipients of this work are expected to abide by these
restrictions and to honor the intended pedagogical purposes and
the needs of other instructors who rely on these materials.

Copyright © 2020 Pearson Education, Inc. All Rights Reserved

You might also like