More about inheritance Exploring polymorphism 3 0 Main

More about inheritance Exploring polymorphism 3. 0

Main concepts to be covered • • • method polymorphism static and dynamic type overriding dynamic method lookup protected access Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 2

The inheritance hierarchy Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 3

Conflicting output What we want CD: A Swingin' Affair (64 mins)* Frank Sinatra tracks: 16 my favourite Sinatra album DVD: O Brother, Where Art Thou? (106 mins) Joel & Ethan Coen The Coen brothers’ best movie! What we have title: A Swingin' Affair (64 mins)* my favourite Sinatra album title: O Brother, Where Art Thou? (106 mins) The Coen brothers’ best movie! Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 4

The problem • The print method in Item only prints the common fields. • Inheritance is a one-way street: – A subclass inherits the superclass fields. – The superclass knows nothing about its subclass’s fields. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 5

Attempting to solve the problem • Place print where it has access to the information it needs. • Each subclass has its own version. • But Item’s fields are private. • Database cannot find a print method in Item. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 6

Static type and dynamic type • A more complex type hierarchy requires further concepts to describe it. • Some new terminology: – static type – dynamic type – method dispatch/lookup Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 7

Static and dynamic type What is the type of c 1? What is the type of v 1? Car c 1 = new Car(); Vehicle v 1 = new Car(); Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 8

Static and dynamic type • The declared type of a variable is its static type. • The type of the object a variable refers to is its dynamic type. • The compiler’s job is to check for static-type violations. for(Item item : items) { item. print(); // Compile-time error. } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 9

Overriding: the solution print method in both superand subclasses. Satisfies both static and dynamic type checking. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 10

Overriding • Superclass and subclass define methods with the same signature. • Each has access to the fields of its class. • Superclass satisfies static type check. • Subclass method is called at runtime – it overrides the superclass version. • What becomes of the superclass version? Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 11

Method lookup No inheritance or polymorphism. The obvious method is selected. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 12

Method lookup Inheritance but no overriding. The inheritance hierarchy is ascended, searching for a match. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 13

Method lookup Polymorphism and overriding. The ‘first’ version found is used. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 14

Method lookup summary The variable is accessed. The object stored in the variable is found. The class of the object is found. The class is searched for a method match. If no match is found, the superclass is searched. • This is repeated until a match is found, or the class hierarchy is exhausted. • Overriding methods take precedence. • • • Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 15

Super call in methods • Overridden methods are hidden. . . • . . . but we often still want to be able to call them. • An overridden method can be called from the method that overrides it. – super. method(. . . ) – Compare with the use of super in constructors. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 16

Calling an overridden method public class CD {. . . public void print() { super. print(); System. out. println(" " + artist); System. out. println(" tracks: " + number. Of. Tracks); }. . . } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 17

Method polymorphism • We have been discussing polymorphic method dispatch. • A polymorphic variable can store objects of varying types. • Method calls are polymorphic. – The actual method called depends on the dynamic object type. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 18

The Object class’s methods • Methods in Object are inherited by all classes. • Any of these may be overridden. • The to. String method is commonly overridden: – public String to. String() – Returns a string representation of the object. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 19

Overriding to. String public class Item {. . . public String to. String() { String line 1 = title + " (" + playing. Time + " mins)"); if(got. It) { return line 1 + "*n" + " " + comment + "n"); } else { return line 1 + "n" + " " + comment + "n"); } }. . . } Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 20

Overriding to. String • Explicit print methods can often be omitted from a class: – System. out. println(item. to. String()); • Calls to println with just an object automatically result in to. String being called: – System. out. println(item); Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 21

Protected access • Private access in the superclass may be too restrictive for a subclass. • The closer inheritance relationship is supported by protected access. • Protected access is more restricted than public access. • We still recommend keeping fields private. – Define protected accessors and mutators. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 22

Access levels Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 23

Review • The declared type of a variable is its static type. – Compilers check static types. • The type of an object is its dynamic type. – Dynamic types are used at runtime. • Methods may be overridden in a subclass. • Method lookup starts with the dynamic type. • Protected access supports inheritance. Objects First with Java - A Practical Introduction using Blue. J, © David J. Barnes, Michael Kölling 24
- Slides: 24