Animal is a superclass of Dog and Dog has a method called bark
public void bark()
{
System.out.println("woof");
}
Consider the following:
Animal a = new Dog();
if (a instanceof Dog){
a.bark();
}
What will happen?
- the assignment isn't allowed
- the call to bark is allowed and "woof" is printed at run time
- the call to bark is allowed but nothing is printed
- the call to bark causes a compile time error
- the call to bark results in a run time error
I said 2 as we are checking if the object is a dog; as dog is the class with the bark method in it, if it is then we call it which will print out :s
Is my understanding correct here?
This won't compile since Animal does not have a method called bark. Think of it this way, all dogs are animals, but not all animals are dogs. All dogs bark, but not all animals bark.
If the idea is to print the subclass method from superclass object, this will work:
Instead of
Animal a = new Dog(); if (a instanceof Dog){ a.bark(); }
change toThis casts the superclass back to subclass and prints it. although its bad design, its one way to know which child class object its pointing to dynamically.
In java(only language i know) you can create an empty method and call it in super class. Then you can override it in subclass to do whatever you want. This way the super class calls its subclass' method.
This code calls an object of Snake then calls an object of Dog. It writes this to console:
Snake doesn't have any bark method so super class' method is called. It writes the first line to the console. Dog has a bark method so super class calls it instead. It writes the second line to the console.
In Head First Java they use the very good analogy of a TV remote control for a reference and your TV as the object that the reference points to. If your remote only has buttons (methods) for on, off, channel up and down, and volume up and down, it doesn't matter what cool features your TV has. You can still only do those few basic things from your remote. You can't mute your TV, for example, if your remote has no mute button.
The Animal reference only knows about Animal methods. It doesn't matter what other methods the underlying object has, you can't access them from an Animal reference.
no - the answer is;
4) the call to bark causes a compile time error
the bark method isnt defined as a method on the assigned type Animal, which will therefore result in compile time issue; this could be solved by casting;
FYI, this is not a good design.
Just about any time you have code of this form:
you are abusing the type system. This is not the way to use classes, it's not the way to write maintainable object oriented code. It's brittle. It's convoluted. It's bad.
You can create template methods in a base class, but they have to call methods that exist in the base class and are overridden in sub-classes.