Class Hierarchy
• Good class design puts all common features as high in the
hierarchy as reasonable
• The class hierarchy determines how methods are executed
• inheritance is transitive
– An instance of class Parrot is also an instance of Bird, an
instance of Animal, ..., and an instance of class Object
A child class of one parent can be the parent of another child, forming class hierarchies. At the top of the hierarchy there’s a default class called Object.
• Good class design puts all common features as high in the
hierarchy as reasonable
• inheritance is transitive :
– An instance of class Parrot is also an instance of Bird, an instance of Animal, ..., and an instance of class Object
• The class hierarchy determines how methods are executed:
– Previously, we took the simplified view that when variable v is an instance of class C, then a procedure call v.proc1() invokes the method proc1() defined in class C
– However, if C is a child of some superclass C’ (and hence v is both an instance of C and an instance of C’), the picture becomes more complex, because methods of class C can override the methods of class C’ (next two slides).
Defining Methods in the Child Class: Overriding by Replacement
• A child class can override the definition of an inherited method in favor of its own
– that is, a child can redefine a method that it inherits from its parent
– the new method must have the same signature as the parent's method, but can have different code in the body
• In java, all methods except of constructors override the methods of their ancestor class by replacement. E.g.:
– the Animal class has method eat()
– the Bird class has method eat() and Bird extends Animal
– variable b is of class Bird, i.e. Bird b = ...
– b.eat() simply invokes the eat() method of the Bird class
• If a method is declared with the final modifier, it cannot be
overridden.
Defining Methods in the Child Class: Overriding by Refinement
• Constructors in a subclass override the definition of an inherited constructor method by refining them (instead of replacing them)
- Assume class Animal has constructors Animal(), Animal(int weight), Animal(int weight, int livespan)
- Assume class Bird which extends Animal has constructors
Bird(), Bird(int weight), Bird(int weight, int livespan)
- Let’s say we create a Bird object, e.g. Bird b = Bird(5)
- This will invoke first the constructor of the Animal (the superclass of Bird) and then the constructor of the Bird.
• This is called constructor chaining: If class C0 extends C1 and C1 extends C2 and ... Cn-1 extends Cn = Object then when creating an instance of object C0 first constructor of Cn is invoked, then constructors of Cn-1, ..., C2, C1, and finally the constructor of C
- The constructors (in each case) are chosen by their signature, e.g. (), (int), etc...
- If no constructor with matching signature is found in any of the class Ci for i>0 then the default constructor is executed for that class
- If no constructor with matching signature is found in the class C0 then this causes a compiler errorFirst the new method must have the same signature as the parent's method, but can
have different code in the body .