1 Inheritance Chapter 9. 2 Module Outcomes To develop a subclass from a superclass through...

Preview:

Citation preview

1

Inheritance

Chapter 9

2

Module Outcomes

• To develop a subclass from a superclass through inheritance

• To invoke the superclass’s constructors and methods using the super keyword

• To override methods in the subclass• To explore the useful methods (equals(Object),

hashCode(), toString(), finalize(), clone(), and getClass()) in the Object class

• To comprehend polymorphism, dynamic binding, and generic programming

3

Module Outcomes

• To describe casting and explain why explicit downcasting is necessary

• To understand the effect of hiding data fields and static methods

• To restrict access to data and methods using the protected visibility modifier

• To declare constants, unmodifiable methods, and nonextendable class using the final modifier

4

Superclasses and Subclasses

Circle-radius

+getRadius+setRadius+findArea

Cylinder

-length

+getLength+setLength+findVolume

SubclassSuperclass

UML Diagram

5

// Cylinder.java: Class definition for describing Cylinderpublic class Cylinder extends Circle { private double length = 1;  /** Return length */ public double getLength() { return length; }  /** Set length */ public void setLength(double length) { this.length = length; }  /** Return the volume of this cylinder */ public double findVolume() { return findArea() * length; }}

Circle-radius

+getRadius+setRadius+findArea

Cylinder

-length

+getLength+setLength+findVolume

SubclassSuperclasssupertype subtype

6

Cylinder cylinder = new Cylinder();System.out.println("The length is " + cylinder.getLength());System.out.println("The radius is " + cylinder.getRadius());System.out.println("The volume of the cylinder is " + cylinder.findVolume());System.out.println("The area of the circle is " + cylinder.findArea());

The length is 1.0

The radius is 1.0

The volume of the cylinder is 3.14159

The area of the circle is 3.14159

The output is

7

Using the Keyword super

• To call a superclass constructor

• To call a superclass method

The keyword super refers to the superclass of the class in which super appears. This keyword can be used in two ways:

8

CAUTION: to call superclass constructor from subclass

•Must use super

•Cannot call a superclass constructor’s name in a subclass – syntax error

•statement that uses the keyword super must appear first in the constructor.

9

NOTE•Properties and methods of superclass are inherited in subclass

• Superclass's constructors are NOT inherited in the subclass

•Superclass's constructors can only be invoked from the subclasses' constructors, using super.

•If the keyword super is not explicitly used, the superclass's no-arg constructor is automatically invoked.

10

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 Cylinder() {

}

is equivalent to

public Cylinder() { super();

}

public A(double d) { // some statements

}

is equivalent to

public A(double d) { super(); // some statements

}

Constructor Chaining

11

Run project CircleCylinder

Study the code and design various tests

12

How is inheritance made possible?

Constructor chaining

13

Constructing an instance of a class invokes all the superclasses’ constructors along the inheritance chain. This is called constructor chaining.

Example:

Constructor Chaining

14

Constructor Chaining

public class Faculty extends Employee { public static void main(String[] args) { new Faculty(); } public Faculty() { // no overloaded constructor nor super(), so call super(); System.out.println("Faculty's no-arg constructor is invoked"); }} class Employee extends Person { public Employee() { // calls overloaded constructor, no super() added this("Invoke Employee’s overloaded constructor"); System.out.println("Employee's no-arg constructor is invoked"); }  public Employee(String s) { // statement only, call super(); System.out.println(s); }} class Person { public Person() { // statement only. Insert super(); which does nothing System.out.println("Person's no-arg constructor is invoked"); }}

15

Trace Executionpublic 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() { System.out.println("(1) Person's no-arg constructor is invoked"); }}

1. Start from the main method

animation

16

Trace Executionpublic 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() { System.out.println("(1) Person's no-arg constructor is invoked"); }}

2. Invoke Faculty constructor

animation

17

Trace Executionpublic 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() { System.out.println("(1) Person's no-arg constructor is invoked"); }}

3. Invoke Employee’s no-arg constructor

animation

18

Trace Executionpublic 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() { System.out.println("(1) Person's no-arg constructor is invoked"); }}

4. Invoke Employee(String) constructor

animation

19

Trace Executionpublic 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() { System.out.println("(1) Person's no-arg constructor is invoked"); }}

5. Invoke Person() constructor

animation

20

Trace Executionpublic 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() { System.out.println("(1) Person's no-arg constructor is invoked"); }}

6. Execute println

animation

21

Trace Executionpublic 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() { System.out.println("(1) Person's no-arg constructor is invoked"); }}

7. Execute println

animation

22

Trace Executionpublic 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() { System.out.println("(1) Person's no-arg constructor is invoked"); }}

8. Execute println

animation

23

Trace Executionpublic 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() { System.out.println("(1) Person's no-arg constructor is invoked"); }}

9. Execute println

animation

24

Order of invoking constructors

• See BJ_Faculty_0

25

Example on the Impact of a Superclass without no-arg Constructor

public class Apple extends Fruit {} class Fruit { public Fruit(String name) { System.out.println("Fruit's constructor is invoked"); }}

Find out the errors in the program:

Will the Apple class compile?

Run: BJ_Apple_Fruit

26

Check projects

• BJ_Apple_Fruit: Not compiled– Fruit: 1-arg constructor– Apple: no constructor

• BJ_Apple_Fruit2: Not compiled– Fruit: 1-arg constructor– Apple: 0-arg constructor

• BJ_Apple_Fruit3: compiled– Fruit: 0-arg constructor, 1-arg constructor– Apple: 0-arg constructor

• BJ_Apple_Fruit4: compiled– Fruit: 1-arg constructor– Apple: super(1-arg)

27

Declaring a SubclassA subclass extends properties and methods from the superclass. You

can also:

Add new properties

Add new methods

Override the methods of the superclass

Question: Can we treat a subclass as a subset of its parent class?

28

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.

// Cylinder.java: New cylinder class that overrides the findArea()

// method defined in the circle class.

public class Cylinder extends Circle {

 /** Return the surface area of this cylinder. The formula is

* 2 * circle area + cylinder body area

*/

public double findArea() {

return 2 * super.findArea() + 2 * getRadius() * Math.PI * length;

}

// Other methods are omitted

}

29

NOTE

•An instance method can be overridden only if it is accessible.

•private method m() in superclass

•private method m() in subclass cannot override the m() in superclass

•The two m() are unrelated

30

Examples

• Class A and subclass B both contain method show()– Method_Overriding project

• Show() in B overrides show() in A

• How to call the show() method of A from B?

• To_Bypass_Overriding project• Show() in B calls show() in A by calling

super.show()

31

NOTE

How about static methods in superclass?

•a static method can be inherited

•a static method cannot be overridden

•If you redefine a static method in a subclass, the method defined in the superclass is hidden.

•See staticMethodOverride.java

32

Check:

• BJ_Method_Overriding

• BJ_Method_Overriding1

• BJ_Method_Overriding2

• Overriding_vs_Overloading

33

The Object ClassAll Java classes descend 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 { ... }

Equivalent public class Circle extends Object { ... }

34

The toString() method in Object

The toString() method returns a string representation of the object. Default implementation returns:

a string with class name of the object is an instance, @, and a number representing this object. Ex:

Cylinder myCylinder = new Cylinder(5.0, 2.0);

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

displays something like Cylinder@15037e5.

- not very helpful or informative.

- should override the toString method to a more meaning string

Recommended