0% found this document useful (0 votes)
89 views

Chapter 11 Inheritance and Polymorphism

This document discusses inheritance and polymorphism in Java. It introduces inheritance as a way to define subclasses that extend existing superclasses to avoid redundancy. It provides examples of Circle and Rectangle subclasses that extend a GeometricObject superclass and inherit its attributes and behaviors while adding their own specific fields and methods. The objectives cover defining subclasses, invoking superclass methods, overriding methods, polymorphism, casting, and using inheritance with ArrayLists.

Uploaded by

Bhavik Dave
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
89 views

Chapter 11 Inheritance and Polymorphism

This document discusses inheritance and polymorphism in Java. It introduces inheritance as a way to define subclasses that extend existing superclasses to avoid redundancy. It provides examples of Circle and Rectangle subclasses that extend a GeometricObject superclass and inherit its attributes and behaviors while adding their own specific fields and methods. The objectives cover defining subclasses, invoking superclass methods, overriding methods, polymorphism, casting, and using inheritance with ArrayLists.

Uploaded by

Bhavik Dave
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 87

Chapter 11 Inheritance and

Polymorphism

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 1
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.

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

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 3
Inheritance
 Inheritance: define new classes from
existing classes.
– A powerful feature for reusing software.
 Inheritance enables you to define a general
class and later extend it to more specialized
classes.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 4
Inheritance
 A class C1 extended from another class C2 is
called a subclass, and C2 is called superclass.
 A superclass is also referred to as a parent class or
a base class.
 A subclass is also referred to as a child class, an
extended class, or a derived class.
 A subclass inherits accessible data fields and
methods from its superclass and may also add new
data fields and methods.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 5
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 Returns the dateCreated.
+toString(): String Returns a string representation of this object.

Circle Rectangle
-radius: double -width: 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
GeometricObject
+getRadius(): double color: String, filled: boolean)
+setRadius(radius: double): void +getWidth(): double Circle
+getArea(): double +setWidth(width: double): void
+getPerimeter(): double +getHeight(): double
+setHeight(height: double): void
Rectangle
+getDiameter(): double
+printCircle(): void +getArea(): double
+getPerimeter(): double TestCircleRectangle
Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 6
public class GeometricObject {

private String color = "white";


private boolean filled;
private java.util.Date dateCreated;

public GeometricObject() {
dateCreated = new java.util.Date();
}

public GeometricObject(String color, boolean filled) {


dateCreated = new java.util.Date();
this.color = color;
this.filled = filled;
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 7
public String getColor() {
return color;
}

public void setColor(String color) {


this.color = color;
}

public boolean isFilled() {


return filled;
}

public void setFilled(boolean filled) {


this.filled = filled;
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 8
public java.util.Date getDateCreated() {
return dateCreated;
}

public String toString() {


return "created on " + dateCreated + "\ncolor: " + color +
" and filled: " + filled;
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 9
public class Circle extends GeometricObject {
private double radius;

public Circle() {
Illegal statements:
}
this.color = color;
this.filled = filled;
public Circle(double radius) {
this.radius = radius;
}

public Circle(double radius, String color, boolean filled) {


this.radius = radius;
setColor(color);
setFilled(filled);
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 10
public double getRadius() {
return radius;
}

public void setRadius(double radius) {


this.radius = radius;
}

public double getArea() {


return radius * radius * Math.PI;
}

public double getDiameter() {


return 2 * radius;
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 11
public double getPerimeter() {
return 2 * radius * Math.PI;
}

public void printCircle() {


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

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 12
public class Rectangle extends GeometricObject {
private double width;
private double height;

public Rectangle() {
}

public Rectangle(double width, double height) {


this.width = width;
this.height = height;
}

public Rectangle(double width, double height, String color, boolean filled) {


this.width = width;
this.height = height;
setColor(color);
setFilled(filled);
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 13
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getArea() {
return width * height;
}
public double getPerimeter() {
return 2 * (width + height);
}
}
Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 14
public class TestCircleRectangle {
public static void main(String[] args) {
Circle circle = new Circle(1);
System.out.println("A circle " + circle.toString());
System.out.println("The radius is " + circle.getRadius());
System.out.println("The area is " + circle.getArea());
System.out.println("The diameter is " + circle.getDiameter());

Rectangle rectangle = new Rectangle(2, 4);


System.out.println("\nA rectangle " + rectangle.toString());
System.out.println("The area is " + rectangle.getArea());
System.out.println("The perimeter is " + rectangle.getPerimeter());
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 15
Inheritance
 Private data fields in a superclass are not accessible
outside the class. They can be accessed/mutated through
public accessors/mutators.
 A subclass and its superclass has the is-a relationship.
 Java does not allow multiple inheritance. A Java class may
inherit directly from only one superclass. This restriction is
known as single inheritance.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 16
Calling Superclass Constructors
 A constructor is used to construct an instance of a class.
Unlike data fields and methods, a superclass's constructors
are not inherited in the subclass.
 They can only be invoked from the constructors of the
subclasses using the keyword super.
 The syntax to call a superclass’s constructor is: super(); or
super(parameters);
 If the keyword super is not explicitly used, the superclass's
no-arg constructor is automatically invoked.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 17
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
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 18
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

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 19
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 appears first in the
constructor.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 20
Constructor Chaining

Constructing an instance of a class invokes all the


superclasses’ constructors along the inheritance chain. This is
known as constructor chaining.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 21
Trace Execution
public class Faculty extends Employee {
public static void main(String[] args) {
new Faculty(); 1. Start from the
} main method
public Faculty() {
System.out.println("(4) Faculty's no-arg constructor is invoked");
}
}
 
class Employee extends Person {
public Employee() {
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");
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 22
Trace Execution
public class Faculty extends Employee {
public static void main(String[] args) {
new Faculty(); 2. Invoke Faculty
} constructor
public Faculty() {
System.out.println("(4) Faculty's no-arg constructor is invoked");
}
}
 
class Employee extends Person {
public Employee() {
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");
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 23
Trace Execution
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");
}
}
  3. Invoke Employee’s no-
class Employee extends Person {
public Employee() {
arg constructor
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");
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 24
Trace Execution
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 { 4. Invoke Employee(String)
public Employee() { constructor
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");
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 25
Trace Execution
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() {
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 {
5. Invoke Person()
public Person() { constructor
System.out.println("(1) Person's no-arg constructor is invoked");
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 26
Trace Execution
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() {
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() { 6. Execute println
System.out.println("(1) Person's no-arg constructor is invoked");
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 27
Trace Execution
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() {
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() { 7. Execute println
System.out.println("(1) Person's no-arg constructor is invoked");
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 28
Trace Execution
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() {
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() { 8. Execute println
System.out.println("(1) Person's no-arg constructor is invoked");
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 29
Trace Execution
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 { 9. Execute println
public Employee() {
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");
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 30
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");
}
}
1. Since no constructor is explicitly defined in
Apple and Apple’s default no-arg constructor is
defined implicitly.
2. Apple’s default constructor automatically
invokes Fruit’s no-arg constructor.
3. Error: Fruit does not have a no-arg
constructor!
Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 31
Design Guide
 Always provide a no-arg constructor for
every class to make the class easy to extend
and to avoid errors.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 32
Defining a Subclass
A subclass inherits from a superclass. You can also:
 Add new data fields
 Add new methods
 Override the methods of the superclass

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 33
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);
}

It is not necessary to
use super here.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 34
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;
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 35
Overriding Methods
 An instance method can be overridden only
if it is accessible.
 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, then these two methods are
completely unrelated.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 36
Overriding Methods
 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.
 The hidden static methods can be invoked using
the syntax SuperClassName.staticMethodName.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 37
Overriding vs. Overloading
 Overloading means to define multiple
methods with the same name but different
parameter lists.
 Overriding means to provide a new
implementation for a method in the subclass.
– To override a method, the method must be
defined in the subclass using the same signature
and the same return type.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 38
Overriding vs. Overloading
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);
Output:
Output:
} } 10
10.0
} } 20.0
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);
} }
} }

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 39
Overriding vs. Overloading
 Overridden methods are in different classes
related by inheritance; overloaded methods
can be either in the same class or different
classes related by inheritance.
 Overridden methods have the same
signature and return type; overloaded
methods have the same name but different
parameter lists.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 40
Overriding vs. Overloading
 To avoid mistakes, you can use a special syntax, called
override annotation, to place @Override before the method
in the subclass.
 If a method with this annotation does not override its
superclass’s method, the compiler will report an error.
 Example:
@Override
public String toString() {
return super.toString() + "\n radius is " +
radius;
}
Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 41
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
...
} }

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 42
The toString() method in Object
The toString() method returns a string representation of the
object. The default implementation returns a string consisting
of a class name of which the object is an instance, the at sign
(@), and a number representing this object.

Loan loan = new Loan();


System.out.println(loan.toString());

The code displays something like Loan@15037e5 . This


message is not very helpful or informative. Usually you should
override the toString method so that it returns a descriptive string
representation of the object.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 43
The toString() method in Object
 When you print an object using
System.out.print(object), this is equivalent
to invoking
System.our.print(object.toString()).

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 44
Subtype and Supertype
 A class defines a type (abstract data type).
 A type defined by a subclass is called a subtype.
 A type defined by a superclass is called a
supertype.
 A subclass is a specialization of its superclass;
every instance of a subclass is also an instance of
its super class, but not vice versa.
– Every circle is a geometric object, but not every
geometric object is a circle.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 45
Polymorphism
 An object of a subtype can be used
wherever its supertype object is required.
This feature is known as polymorphism.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 46
public class PolymorphismDemo {

public static void main(String[] args) {

displayObject(new Circle(1, "red", false));


displayObject(new Rectangle(1, 1, "black", true));
} polymorphism
public static void displayObject(GeometricObject object) {

System.out.println("Created on " + object.getDateCreated() +


". Color is " + object.getColor());
}
}
PolymorphismDemo

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 47
Dynamic Binding
 A method can be defined in several classes along
the inheritance chain. The JVM decides which
method is invoked at runtime.
 Example:
Object o = new GeometricObject():
System.out.println(o.toString());
Which toString() method is invoked?

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 48
Dynamic Binding
 The type that declares a variable is called the
variable’s declared type.
 The actual type of the variable is the actual class
for the object referenced by the variable.
declared type actual type
Object o = new GeometricObject():

System.out.println(o.toString());

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 49
public class PolymorphismDemo {
public static void main(String[] args) {
m(new GraduateStudent());
m(new Student());
m(new Person());
m(new Object()); Method m takes a parameter
 
} of the Object type. You can
public static void m(Object x) { invoke it with any object.
System.out.println(x.toString());
}
} 1. When the method m is executed, the
 
class GraduateStudent extends Student { argument x’s toString method is invoked.
}
 
2. x may be an instance of GraduateStudent,
class Student extends Person { Student, Person, or Object.
public String toString() { 3. The Student and Person classes have their
return "Student";
} own toString method.
}
 
4. Which implementation is used will be
class Person extends Object { determined dynamically by the Java Virtual
public String toString() { Machine at runtime.
return "Person";
} This capability is known as dynamic
} binding.

DynamicBindingDemo
Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 50
 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.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 51
Dynamic Binding

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

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 52
public class PolymorphismDemo {
public static void main(String[] args) {
m(new GraduateStudent());
m(new Student()); Output:
m(new Person());
m(new Object()); Student
}
  Student
public static void m(Object x) {
System.out.println(x.toString());
Person
}
} java.lang.Object@130c19b
 
class GraduateStudent extends Student {
}
 
class Student extends Person {
public String toString() {
return "Student";
}
}
 
class Person extends Object {
public String toString() {
return "Person";
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 53
Generic Programming
 Polymorphism allows methods to be used generically for a
wide range of object arguments. This is known as generic
programming.
 If a method’s parameter type is a superclass (e.g., Object),
you may pass an object to this method of any of the
parameter’s subclasses (e.g., Student or String).
 When an object (e.g., a Student object or a String object) is
used in the method, the particular implementation of the
method of the object that is invoked (e.g., toString) is
determined dynamically.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 54
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:

Object o = new Student(); // Implicit casting


m(o);

The statement Object o = new Student(), known as


implicit casting, is legal because an instance of
Student is automatically an instance of Object.
Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 55
Casting Objects
 Example:
Object o = new Student();
Student b = o; //error!!
 A Student object is always an instance of Object, but an
Object is not necessarily an instance of Student.
 Even though 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.
Student b = (Student)o; // Explicit casting

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 56
Casting from
Superclass to Subclass
 Explicit casting must be used when casting an object of
a superclass to a variable of its subclass.
 However, if the superclass object is not actually an
instance of the subclass, a runtime error occurs.
 Example:
Object o = new Person();
Student b = (Student)o; //Error!

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 57
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());
...
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 58
Caution!
 The object member access operator (.)
precedes the casting operator. Use
parentheses to ensure that casting is done
before the . Operator.
 Example:
((Circle)myObject).getArea();

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 59
Example: Demonstrating
Polymorphism and Casting
 This example creates two geometric objects: a
circle, and a rectangle, invokes the displayObject
method to display the objects.
 The displayObject displays the area and diameter
if the object is a circle, and displays area if the
object is a rectangle.

CastingDemo

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 60
public class CastingDemo {
public static void main(String[] args) {

Object object1 = new Circle(1);


Object object2 = new Rectangle(1, 1);
displayObject(object1);
displayObject(object2);
}

public static void displayObject(Object o) {


if (o instanceof Circle) {
System.out.println("The circle area is " + ((Circle)o).getArea());
System.out.println("The circle diameter is " + ((Circle)o).getDiameter());
}
else if (o instanceof Rectangle)
System.out.println("The rectangle area is " + ((Rectangle)o).getArea());
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 61
The equals Method
 Like the toString()method, the
equals method is another method defined
in the Object class.
 The equals method tests whether two
objects are equal.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 62
The equals Method
 The default implementation of the equals method in the
Object class is as follows:
public boolean equals(Object obj) {
return (this == obj);
}
 This default implementation checks whether two
reference variables point to the same object!

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 63
The equals Method
 Always override this method in your class if you want to
compare whether the contents of two objects are equal.
 For example, the equals method can be overridden in
the Circle class.

public boolean equals(Object o) {


if (o instanceof Circle) {
return radius == ((Circle)o).radius; Not (Circle o)!
}
else
return false;
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 64
Example
public class Circle {
public static void main(String[] args) ……
{ public boolean equals(Circle c){
Object o1 = new Circle(1); return radius == c.radius;
Object o2 = new Circle(1); }
}
if (o1.equals(o2))
System.out.println(“objects are equal");
Inherited from the
else
Object class
System.out.println(“objects are not equal");
}

public boolean equals(Object obj)


{
return (this == obj);
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 65
NOTE
 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.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 66
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.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 67
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>();


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

TestArrayList
Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 68
import java.util.ArrayList;

public class TestArrayList {


public static void main(String[] args) {
// Create a list to store cities
ArrayList<String> cityList = new ArrayList<>();

// Add some cities in the list


cityList.add("London");
// cityList now contains [London]
cityList.add("Denver");
// cityList now contains [London, Denver]
cityList.add("Paris");
// cityList now contains [London, Denver, Paris]
cityList.add("Miami");
// cityList now contains [London, Denver, Paris, Miami]

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 69
cityList.add("Seoul");
// contains [London, Denver, Paris, Miami, Seoul]
cityList.add("Tokyo");
// contains [London, Denver, Paris, Miami, Seoul, Tokyo]

System.out.println("List size? " + cityList.size());


System.out.println("Is Miami in the list? " + cityList.contains("Miami"));
System.out.println("Is the list empty? " + cityList.isEmpty()); // Print false

// Insert a new city at index 2


cityList.add(2, "Xian");
// contains [London, Denver, Xian, Paris, Miami, Seoul, Tokyo]

// Remove a city from the list


cityList.remove("Miami");
// contains [London, Denver, Xian, Paris, Seoul, Tokyo]

// Remove a city at index 1


cityList.remove(1);
// contains [London, Xian, Paris, Seoul, Tokyo]

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 70
// Display the contents in the list
System.out.println(cityList.toString());

// Display the contents in the list in reverse order


for (int i = cityList.size() - 1; i >= 0; i--)
System.out.print(cityList.get(i) + " ");
System.out.println();

// Create a list to store two circles


ArrayList<Circle> list = new ArrayList<>();

// Add two circles


list.add(new Circle(2));
list.add(new Circle(3));

// Display the area of the first circle in the list


System.out.println("The area of the circle? " + list.get(0).getArea());
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 71
Differences and Similarities between
Arrays and ArrayList
Operation Array ArrayList

Creating an array/ArrayList String[] a = new String[10] ArrayList<String> list = 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 list.add("London");
Inserting a new element list.add(index, "London");
Removing an element list.remove(index);
Removing an element list.remove(Object);
Removing all elements list.clear();

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 72
import java.util.ArrayList;
import java.util.Scanner; Example: ask the
user to enter a
public class DistinctNumbers { sequence of
public static void main(String[] args) { numbers and
ArrayList<Integer> list = new ArrayList<>(); display the distinct
Scanner input = new Scanner(System.in);
numbers.
int value;

do {
value = input.nextInt();
if (!list.contains(value) && value != 0)
DistinctNumbers
list.add(value);
} while (value != 0);

for (int i = 0; i < list.size(); i++)


System.out.println(list.get(i) + " ");
}
}
Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 73
Useful Methods for Lists
 Java provides the methods from creating a
list from an array, for sorting a list, and for
finding maximum and minimum element in
a list, and for shuffling a list.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 74
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);

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 75
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)));

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 76
Sorting 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.sort(list);
System.out.println(list);
//displays [3, 3, 4, 5, 5, 6, 15, 34, 95]

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 77
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);

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 78
The MyStack Classes
A stack to hold objects.
Stack Animation
MyStack https://liveexample.pearsoncmg.com/ds
animation/StackeBook.html

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.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 79
import java.util.ArrayList;

public class MyStack {


private ArrayList<Object> list = new ArrayList<>();

public boolean isEmpty() {


return list.isEmpty();
}

public int getSize() {


return list.size();
}

public Object peek() {


return list.get(getSize() - 1);
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 80
public Object pop() {
Object o = list.get(getSize() - 1);
list.remove(getSize() - 1);
return o;
}

public void push(Object o) {


list.add(o);
}

@Override /** Override the toString in the Object class */


public String toString() {
return "stack: " + list.toString();
}
}

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 81
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 its subclasses in any package or any class in the
same package.
 private, default, protected, public

Visibility increases

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

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 82
Accessibility Summary

Modifier Accessed Accessed Accessed Accessed


on members from the from the from a from a different
in a class same class same package subclass package

public

protected -

default - -

private - - -

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 83
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();
} } }

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 84
Caution
 A subclass may override a protected method in its
superclass and change its visibility to public.
 However, a subclass cannot reduce the visibility 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.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 85
Preventing Extending and Overriding

 Use the final modifier to indicate that a


class is final and can not be a super class.
 The Math, String, StringBuilder, and
StringBuffer classes are final classes.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 86
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.

Liang, Introduction to Java Programming, Eleventh Edition, (c) 2017 Pearson Education, Inc. All
rights reserved. 87

You might also like