Java Reference
In-Depth Information
Exercise 9.7
Having to use a superclass call in
display
is somewhat restrictive in the ways in
which we can format the output, because it is dependent on the way the superclass formats its fields.
Make any necessary changes to the
Post
class and to the
display
method of
MessagePost
so
that it produces the output shown in Figure 9.11. Any changes you make to the
Post
class should
be visible only to its subclasses.
Hint:
You could add protected accessors to do this.
Figure 9.11
Output from
display
mixing subclass and
superclass details
(shaded areas represent
superclass details)
Leonardo da Vinci
Had 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.
9.10
The
instanceof
operator
One of the consequences of the introduction of inheritance into the
network
project has been
that the
NewsFeed
class knows only about
Post
objects and cannot distinguish between
message posts and photo posts. This has allowed all types of post to be stored in a single list.
However, suppose that we wish to retrieve just the message posts or just the photo posts from
the list; how would we do that? Or perhaps we wish to look for a message by a particular
author? That is not a problem if the
Post
class defines a
getAuthor
method, but this will find
both message and photo posts. Will it matter which type is returned?
There are occasions when we need to rediscover the distinctive dynamic type of an object rather
than dealing with a shared supertype. For this, Java provides the
instanceof
operator. The
instanceof
operator tests whether a given object is, directly or indirectly, an instance of a
given class. The test
obj instanceof MyClass
returns
true
if the dynamic type of
obj
is
MyClass
or any subclass of
MyClass
. The left
operand is always an object reference, and the right operand is always the name of a class. So
post instanceof MessagePost
returns
true
only if
post
is a
MessagePost
, as opposed to a
PhotoPost
, for instance.
Use of the
instanceof
operator is often followed immediately by a cast of the object refer-
ence to the identified type. For instance, here is some code to identify all of the message posts
in a list of posts and to store them in a separate list.
ArrayList<MessagePost> messages = new ArrayList<MessagePost>();
for(Post post : posts) {
if(post instanceof MessagePost) {
messages.add((MessagePost) post);
}
}
It should be clear that the cast here does not alter the post object in any way, because we have
just established that it already is a
MessagePost
object.
Search WWH ::
Custom Search