more about inheritance exploring polymorphism 5.0
Post on 13-Dec-2015
215 Views
Preview:
TRANSCRIPT
2
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 BlueJ, © David J. Barnes, Michael Kölling
3
The inheritance hierarchy
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
display() method is in superclass Post
4
Conflicting output
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
Leonardo da VinciHad a great idea this morning.But now I forgot what it was. Something to do with flying ... 40 seconds ago - 2 people like this. No comments.
Alexander Graham Bell[experiment.jpg]I think I might call this thing 'telephone'.12 minutes ago - 4 people like this. No comments.
Leonardo da Vinci40 seconds ago - 2 people like this. No comments.
Alexander Graham Bell12 minutes ago - 4 people like this. No comments.
What we want(original w/oinheritance)
What we have(results w/
inheritance)
5
The problem
• The display method in Post only prints the common fields
• Inheritance is a one-way street:– A subclass inherits the superclass fields– Superclass knows nothing about subclass’s
fieldsObjects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
6
Attempting to solve the problem
• Place display where it has access to the information it needs
• Each subclass has its own version
• But Post’s fields are private
• NewsFeed cannot find a display method in Post
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
7
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 BlueJ, © David J. Barnes, Michael Kölling
8
Static and dynamic type
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
Car c1 = new Car();What is the type of c1?
Vehicle v1 = new Car();What is the type of v1?
9
Static and dynamic type
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
Car c1 = new Car();What is the type of c1?
Vehicle v1 = new Car();What is the type of v1?
Car (type)
Vehicle (static type)Car (dynamic type)
10
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(Post post : posts) { post.display(); // Compile-time error.}
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
11
Overriding: the solution
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
display method in both super- and subclasses
Satisfies both static and
dynamic type checking
NOTE: display method in Post would never execute!
12
Overriding• Superclass and subclass define
methods with the same signature
• Each has access to the fields of its own 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 BlueJ, © David J. Barnes, Michael Kölling
13
Distinct static anddynamic types
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
The variable post has a:• static type of Post• dynamic type of PhotoPost
14
Method lookup
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
No inheritance or polymorphism.The obvious method is selected.display is executed from PhotoPost
15
Method lookup
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
Inheritance (without overriding) where the inheritance hierarchy is ascended, searching for a match.
display is NOT found in PhotoPost, but it is found and executed from Post
16
Method lookup
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
Polymorphism and overriding exists, where search starts with dynamic type (ascending up)
and the first version found is used.display is found & executed in PhotoPost
17
Method lookup summary
• The variable is accessed
• The object stored in the variable is found
• The (dynamic) 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 BlueJ, © David J. Barnes, Michael Kölling
18
Super call in methods• Overridden methods are hidden, but
we may still want to be able to call them
• An overridden method can be called from the method that overrides it by using super (i.e. super.method())
• Compare with the use of super in constructors (i.e. super())– method name is explicitly stated (i.e. super.method())– super.method may be used anywhere, and
not just the first statement (as with constructors)– no automatic super call (as in constructors) is
generated, nor is a super.method call required
19
Calling an overridden method
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
public void display(){ super.display(); System.out.println(" [" + filename
+ "]"); System.out.println(" " + caption);}
Calls the superclass display method and then continues with printing its own fields.
20
Method polymorphism
• We have been discussing polymorphic method dispatch
• A polymorphic variable can store objects of varying types
• Method calls are also polymorphic
– The actual method called depends on the dynamic object type
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
21
The Object class’s methods
• Methods in the Object library class are inherited by ALL classes
• Any of those found in Object may be overridden (i.e. toString)
• The implicitly-defined toString method is commonly overridden:– public String toString()– returns a string representation of
the object
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
22
Overriding toString in Post
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
public String toString(){ String text = username + "\n" + timeString(timestamp); if(likes > 0) { text += " - " + likes + " people like this.\n"; } else { text += "\n"; } if(comments.isEmpty()) { return text + " No comments.\n"; } else { return text + " " + comments.size() + " comment(s). Click here to view.\n"; }}
23
Overriding toString
• Explicit print methods can often be omitted from a class: System.out.println(post.toString());
• Calls to println and print with just an object automatically result in toString being called: System.out.println(post);
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
24
StringBuilder• Consider using StringBuilder as
an alternative to concatenation:StringBuilder builder = new StringBuilder();builder.append(username);builder.append('\n');builder.append(timeString(timestamp));…return builder.toString();
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
The overloaded append method takes a parameter of any type and effectively converts it to its string representation before appending
it to the original StringBuilder object.
25
Object equality• What does it mean for two objects
to be ‘the same’?– Reference equality
(only 1 object)– Content equality
(2 objects with the same internal states)
• Compare use of == with equals() in with strings in the String class:– == compares reference equality– equals() compares content equality
26
Overriding equals
public boolean equals(Object obj){ if(this == obj) { return true; // reference to itself } if(!(obj instanceof ThisType)) { return false; // different object types } ThisType other = (ThisType) obj;
// cast into right variable type return field.equals(other.field) && … // compare all field contents of this and other} // for content equality
public boolean equals(Object obj){ return this == obj; // reference to itself}
Object class method actually tests for reference equality!
To test for content equality, we must override the method!
27
Overriding equals in Student
public boolean equals(Object obj){ if(this == obj) { return true; // reference equality } if(!(obj instanceof Student)) { return false; // different object types } Student other = (Student) obj; // cast return name.equals(other.name) && id.equals(other.id) && credits == other.credits;} // test content equality
28
Overriding hashCode in Student
/** * Uses values of name, id & credits fields * to calculate the distinct hashCode * representation of a specific Student object */public int hashCode(){ int result = 17; result = 37 * result + name.hashCode(); result = 37 * result + id.hashCode(); result = 37 * result + credits; return result;}
hashCode method should also be overridden whenever the equals method is overridden.
29
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
• But allows access to fields/methods within a class itself AND from all its subclasses– protected accessors, mutators & constructors
• We still recommend keeping fields private – to maintain encapsulation
30
Access levels
Method calls from Subclass to protected methods in its superclass SomeClass are made similar to calls to its own
internal methods. Thus, NO object variable (with dot notation) is necessary. getSomeClassField()
31
The instanceof operator
• Used to determine the dynamic type
• Recovers ‘lost’ type information
• Usually precedes assignment with a cast to the dynamic type:
if(post instanceof MessagePost) { MessagePost msg =(MessagePost) post; … access MessagePost methods via msg …}
Objects First with Java - A Practical Introduction using BlueJ, © David J. Barnes, Michael Kölling
32
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 BlueJ, © David J. Barnes, Michael Kölling
top related