1. But that's not all.
Suppose the Cow
class has a printAll()
method that calls two other methods. Then the code will work like this:
Code | Description |
---|---|
|
|
|
The screen output will be:
|
Note that when the printAll()
method in the Cow
class is called on a Whale
object, the printName
method of the Whale
class is used, not the one in the Cow
method.
The main thing isn't the class the method is written in, but rather the type (class) of the object on which the method is called.
Only non-static methods can be inherited and overridden. Static methods are not inherited and therefore cannot be overridden.
Here's what the Whale
class looks like after applying inheritance and method overriding:
|
Here's what the Whale class looks like after applying inheritance and method overriding: We don't know about any old printName method. |
2. Typecasting
There is an even more interesting point here. Because a class inherits all the methods and data of its parent class, a reference to an object of the child class can to stored in (assigned to) variables whose type is the same as the parent class (and the parent's parent, etc. — all the way up to the Object
class). Example:
Code | Description |
---|---|
|
The screen output will be:
|
|
The screen output will be:
|
|
The screen output will be:
The toString() method is inherited from the Object class
|
This is a very valuable property: a little later you will understand how to use it in practice.
3. Calling a method on an object
When a method is called on a variable, the method is actually called on an object. This mechanism is called dynamic method dispatch.
Here's how it looks:
Code | Description |
---|---|
|
The screen output will be:
|
|
The screen output will be:
|
Note that the specific implementation of the printName()
method that gets called — the one in the Cow
or the one in the Whale
class — is not determined by the variable's type, but by the type of the object that the variable refers to.
The Cow
variable stores a reference to a Whale
object, and the printName()
method defined in the Whale
class is what is called.
This is not very obvious. Remember the main rule:
The set of methods available to be called on a variable is determined by the variable's type. And the specific method implementation that gets called is determined by the type/class of the object referred to by the variable.
You'll encounter this all the time, so the sooner you remember this, the better.
GO TO FULL VERSION