3 Inheritance

download 3 Inheritance

of 48

Transcript of 3 Inheritance

  • 8/2/2019 3 Inheritance

    1/48

    1

    Inheritance and Polymorphism

  • 8/2/2019 3 Inheritance

    2/48

    2

    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 answeris to use inheritance.

  • 8/2/2019 3 Inheritance

    3/48

    3

    Objectives To develop a subclass from a superclass through inheritance.

    To invoke the superclasss constructors and methods using the super keyword.

    To override instance methods in the subclass.

    To distinguish differences between overriding and overloading.

    To explore the toString() method in the Object class.

    To discover polymorphism and dynamic binding.

    To describe casting and explain why explicit downcasting is necessary.

    To explore the equals() method in the Object class.

    To store, retrieve, and manipulate objects in an ArrayList .

    To implement a Stack class using ArrayList .

    To restrict access to data and methods to subclasses using the protected visibilitymodifier.

    To prevent class extending and method overriding using the final modifier.

  • 8/2/2019 3 Inheritance

    4/48

    4

    Superclasses and Subclasses

    GeometricObject1

    Circle4

    Rectangle1

    TestCircleRectangle

    Run

    GeometricObject

    -color: String

    -filled: boolean

    -dateCreated: java.util.Date

    +GeometricObject()

    +GeometricObject(color: String,

    filled: boolean)

    +getColor(): String

    +setColor(color: String): void

    +isFilled(): boolean

    +setFilled(filled: boolean): void

    +getDateCreated(): java.util.Date

    +toString(): String

    The color of the object (default: white).

    Indicates whether the object is filled with a color (default: false).

    The date when the object was created.

    Creates a GeometricObject.

    Creates a GeometricObject with the specified color and filled

    values.

    Returns the color.

    Sets a new color.

    Returns the filled property.

    Sets a new filled property.

    Returns the dateCreated.

    Returns a string representation of this object.

    Circle

    -radius: double

    +Circle()

    +Circle(radius: double)

    +Circle(radius: double, color: String,

    filled: boolean)

    +getRadius(): double

    +setRadius(radius: double): void

    +getArea(): double

    +getPerimeter(): double

    +getDiameter(): double

    +printCircle(): void

    Rectangle

    -width: double

    -height: double

    +Rectangle()

    +Rectangle(width: double, height: double)

    +Rectangle(width: double, height: double

    color: String, filled: boolean)

    +getWidth(): double

    +setWidth(width: double): void

    +getHeight(): double

    +setHeight(height: double): void

    +getArea(): double

    +getPerimeter(): double

  • 8/2/2019 3 Inheritance

    5/48

  • 8/2/2019 3 Inheritance

    6/48

    6

    Superclasss Constructor Is Always Invoked

    A constructor may invoke an overloaded constructor or its

    superclasss constructor. If none of them is invokedexplicitly, the compiler puts super() as the first statement

    in the constructor. For example,

    public A(double d) {

    // some statements

    }is equivalent to

    public A(double d) {

    super();

    // some statements

    }

    public A() {

    } is equivalent to public A() {super();}

  • 8/2/2019 3 Inheritance

    7/487

    Using the Keyword super

    To call a superclass constructor

    To call a superclass method

    The keyword super refers to the superclassof the class in which super appears. This

    keyword can be used in two ways:

  • 8/2/2019 3 Inheritance

    8/488

    CAUTION

    You must use the keyword super to call the

    superclass constructor. Invoking a

    superclass constructors name in a subclasscauses a syntax error. Java requires that the

    statement that uses the keyword super

    appear first in the constructor.

    C Ch i i

  • 8/2/2019 3 Inheritance

    9/489

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

    this("(2) Invoke Employees 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");

    }

    }

    Constructing an instance of a class invokes all the superclasses constructors

    along the inheritance chain. This is called constructor chaining.

  • 8/2/2019 3 Inheritance

    10/4810

    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 Employees 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

  • 8/2/2019 3 Inheritance

    11/4811

    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 Employees 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

  • 8/2/2019 3 Inheritance

    12/4812

    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 Employees 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 Employees no-

    arg constructor

    animation

  • 8/2/2019 3 Inheritance

    13/48

    13

    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 Employees 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

  • 8/2/2019 3 Inheritance

    14/48

    14

    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 Employees 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

  • 8/2/2019 3 Inheritance

    15/48

    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 Employees 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

  • 8/2/2019 3 Inheritance

    16/48

    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 Employees 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

  • 8/2/2019 3 Inheritance

    17/48

    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 Employees 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

    i i

  • 8/2/2019 3 Inheritance

    18/48

    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 Employees 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

  • 8/2/2019 3 Inheritance

    19/48

    19

    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:

  • 8/2/2019 3 Inheritance

    20/48

    20

    Declaring a Subclass

    A subclass extends properties and methods from thesuperclass. You can also:

    Add new properties

    Add new methods

    Override the methods of the superclass

  • 8/2/2019 3 Inheritance

    21/48

    21

    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);

    }

  • 8/2/2019 3 Inheritance

    22/48

    22

    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 methoddefined 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;

    }

    }

  • 8/2/2019 3 Inheritance

    23/48

    23

    NOTE

    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.

  • 8/2/2019 3 Inheritance

    24/48

    24

    NOTE

    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.

  • 8/2/2019 3 Inheritance

    25/48

    25

    Overriding vs. Overloading

    public class Test {

    public static voidmain(String[] args) {

    A a = new A();

    a.p(10);

    a.p(10.0);

    }

    }

    class B {

    public voidp(double i) {

    System.out.println(i * 2);}

    }

    class A extends B {

    // This method overrides the method in Bpublic voidp(double i) {

    System.out.println(i);

    }}

    public class Test {

    public static voidmain(String[] args) {

    A a = new A();

    a.p(10);

    a.p(10.0);

    }

    }

    class B {

    public voidp(double i) {

    System.out.println(i * 2);}

    }

    class A extends B {

    // This method overloads the method in Bpublic voidp(int i) {

    System.out.println(i);

    }}

  • 8/2/2019 3 Inheritance

    26/48

    26

    The Object Class and Its Methods

    Every class in Java is descended from thejava.lang.Object class. If no inheritance is

    specified when a class is defined, the

    superclass of the class is Object.

    public class Circle {

    ...

    }

    Equivalentpublic class Circle extends Object {

    ...}

  • 8/2/2019 3 Inheritance

    27/48

    27

    The toString() method in Object

    The toString() method returns a string representation of the

    object. The default implementation returns a string consistingof 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 . Thismessage is not very helpful or informative. Usually you shouldoverride the toString method so that it returns a digestible stringrepresentation of the object.

  • 8/2/2019 3 Inheritance

    28/48

    28

    Polymorphism, Dynamic Binding and Generic Programmingpublic class PolymorphismDemo {

    public static void main(String[] args) {

    m(new GraduateStudent());

    m(new Student());

    m(new Person());

    m(new Object());

    }

    public static void m(Object x) {

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

    }

    }

    class GraduateStudent extends Student {

    }

    class Student extends Person {

    public String toString() {

    return "Student";

    }

    }

    class Person extends Object {

    public String toString() {

    return "Person";

    }

    }

    Method m takes a parameter

    of the Object type. You can

    invoke it with any object.

    An object of a subtype can be used wherever its

    supertype value is required. This feature is

    known aspolymorphism.

    When the method m(Object x) is executed, theargument xs toString method is invoked. xmay be an instance of GraduateStudent,Student, Person, or Object. ClassesGraduateStudent, Student, Person, and Object

    have their own implementation of the toStringmethod. Which implementation is used will bedetermined dynamically by the Java VirtualMachine at runtime. This capability is knownas dynamic binding.

    PolymorphismDemo

    Run

  • 8/2/2019 3 Inheritance

    29/48

  • 8/2/2019 3 Inheritance

    30/48

    30

    Method Matching vs. BindingMatching a method signature and binding a method

    implementation are two issues. The compiler finds amatching method according to parameter type, numberof parameters, and order of the parameters atcompilation time. A method may be implemented in

    several subclasses. The Java Virtual Machinedynamically binds the implementation of the method atruntime. See Review Questions 10.7 and 10.9.

  • 8/2/2019 3 Inheritance

    31/48

    31

    Generic Programmingpublic class PolymorphismDemo {

    public static void main(String[] args) {

    m(new GraduateStudent());

    m(new Student());

    m(new Person());

    m(new Object());

    }

    public static void m(Object x) {

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

    }

    }

    class GraduateStudent extends Student {

    }

    class Student extends Person {

    public String toString() {

    return "Student";

    }

    }

    class Person extends Object {

    public String toString() {

    return "Person";

    }

    }

    Polymorphism allows methods to be usedgenerically for a wide range of object

    arguments. This is known as genericprogramming. If a methods parametertype is a superclass (e.g., Object), youmay pass an object to this method of anyof the parameters subclasses (e.g.,Student or String). When an object (e.g., a

    Student object or a String object) is usedin the method, the particularimplementation of the method of theobject that is invoked (e.g., toString) isdetermined dynamically.

  • 8/2/2019 3 Inheritance

    32/48

    32

    Casting ObjectsYou have already used the casting operator to convert variables of

    one primitive type to another. Casting can also be used to convert anobject 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.

  • 8/2/2019 3 Inheritance

    33/48

    33

    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 compilation error would occur. Why does the statement Object o =

    new Student() work and the statement Student b = odoesnt? This isbecause a Student object is always an instance of Object, but anObject is not necessarily an instance of Student. Even though you cansee that o is really a Student object, the compiler is not so clever toknow 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 amongprimitive data types. Enclose the target object type in parentheses andplace it before the object to be cast, as follows:

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

  • 8/2/2019 3 Inheritance

    34/48

    34

    Casting from

    Superclass to SubclassExplicit 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;

  • 8/2/2019 3 Inheritance

    35/48

    35

    The instanceof Operator

    Use theinstanceof

    operator to test whether an object is an instanceof 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());

    ...

    }

  • 8/2/2019 3 Inheritance

    36/48

    36

    TIP

    To help understand casting, you may alsoconsider the analogy of fruit, apple, andorange with the Fruit class as the superclassfor Apple and Orange. An apple is a fruit, so

    you can always safely assign an instance ofApple to a variable for Fruit. However, afruit is not necessarily an apple, so you have

    to use explicit casting to assign an instanceof Fruit to a variable of Apple.

  • 8/2/2019 3 Inheritance

    37/48

    37

    Example: Demonstrating

    Polymorphism and CastingThis example creates two geometric objects: a

    circle, and a rectangle, invokes the

    displayGeometricObject method to display theobjects. The displayGeometricObject displays

    the area and diameter if the object is a circle, and

    displays area if the object is a rectangle.

    TestPolymorphismCasting Run

  • 8/2/2019 3 Inheritance

    38/48

    38

    The equals Method

    The equals() method compares the

    contents of two objects. The default implementation of theequals method in the Object class is as follows:

    public boolean equals(Object obj) {

    return (this == obj);}

    For example, the

    equals method is

    overridden in

    the Circle

    class.

    public boolean equals(Object o) {

    if (o instanceof Circle) {

    return radius == ((Circle)o).radius;

    }

    else

    return false;

    }

  • 8/2/2019 3 Inheritance

    39/48

    39

    NOTEThe == comparison operator is used for

    comparing two primitive data type values or fordetermining whether two objects have the same

    references. The equals method is intended to

    test whether two objects have the samecontents, provided that the method is modified

    in the defining class of the objects. The ==

    operator is stronger than the equals method, inthat the == operator checks whether the two

    reference variables refer to the same object.

  • 8/2/2019 3 Inheritance

    40/48

    40

    The ArrayList and Vector Classes

    You can create an array to store objects. But the arrays size is fixed

    once the array is created. Java provides the ArrayList class that canbe used to store an unlimited number of objects.

    java.util.ArrayList

    +ArrayList()

    +add(o: Object) : void

    +add(index: int, o: Object) : void

    +clear(): void

    +contains(o: Object): boolean

    +get(index: int) : Object

    +indexOf(o: Object) : int

    +isEmpty(): boolean

    +lastIndexOf(o: Object) : int

    +remove(o: Object): boolean

    +size(): int

    +remove(index: int) : Object

    +set(index: int, o: Object) : Object

    Appends a new element o at the end of this list.

    Adds a new element o at the specified index in this list.

    Removes all the elements from this list.

    Returns true if this list contains the element o.

    Returns the element from this list at the specified index.

    Returns the index of the first matching element in this list.

    Returns true if this list contains no elements.

    Returns the index of the last matching element in this list.

    Removes the element o from this list.

    Returns the number of elements in this list.

    Removes the element at the specified index.

    Sets the element at the specified index.

    Creates an empty list.

  • 8/2/2019 3 Inheritance

    41/48

    41

    Compile Warning

    You will get a compilation warning unchecked

    operation. Ignore it. This warning can be fixedusing generic types.

    TestArrayList Run

  • 8/2/2019 3 Inheritance

    42/48

    42

    The MyStack Classes

    A stack to hold objects.

    MyStack

    MyStack

    -list: ArrayList+isEmpty(): boolean

    +getSize(): int

    +peek(): Object

    +pop(): Object+push(o: Object): void

    +search(o: Object): int

    Returns true if this stack is empty.

    Returns the number of elements in this stack.

    Returns the top element in this stack.

    Returns and removes the top element in this stack.Adds a new element to the top of this stack.

    Returns the position of the first element in the stack from

    the top that matches the specified element.

    A list to store elements.

  • 8/2/2019 3 Inheritance

    43/48

    43

    The protected Modifier

    The protected modifier can be applied on dataand methods in a class. A protected data or aprotected method in a public class can be accessedby any class in the same package or its subclasses,

    even if the subclasses are in a different package.private, default, protected, public

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

    Visibility increases

  • 8/2/2019 3 Inheritance

    44/48

    44

    Accessibility Summary

    Modifier

    on members

    in a class

    Accessed

    from the

    same class

    Accessed

    from the

    same package

    Accessed

    from a

    subclass

    Accessed

    from a different

    package

    public

    protected -

    default - -

    private - - -

  • 8/2/2019 3 Inheritance

    45/48

    45

    Visibility Modifiers

    public class C1 {

    public int x;

    protected int y;

    int z;

    private int u;

    protected void m() {

    }

    }

    public class C2 {

    C1 o = new C1();

    can access o.x;

    can access o.y;

    can access o.z;

    cannot access o.u;

    can invoke o.m();

    }

    public class C3

    extends C1 {

    can access x;

    can access y;can access z;

    cannot access u;

    can invoke m();

    }

    package p1;

    public class C4

    extends C1 {

    can access x;

    can access y;cannot access z;

    cannot access u;

    can invoke m();

    }

    package p2;

    public class C5 {

    C1 o = new C1();

    can access o.x;

    cannot access o.y;cannot access o.z;

    cannot access o.u;

    cannot invoke o.m();

    }

  • 8/2/2019 3 Inheritance

    46/48

    46

    A Subclass Cannot Weaken the Accessibility

    A subclass may override a protectedmethod in its superclass and change its

    visibility to public. However, a subclass

    cannot weaken the accessibility of amethod defined in the superclass. For

    example, if a method is defined as public

    in the superclass, it must be defined aspublic in the subclass.

  • 8/2/2019 3 Inheritance

    47/48

    47

    NOTE

    The modifiers are used on classes andclass members (data and methods), except

    that the final modifier can also be used on

    local variables in a method. A final localvariable is a constant inside a method.

  • 8/2/2019 3 Inheritance

    48/48

    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 beoverridden by its subclasses.