I've just been through the OO concepts test on enthuware and this little gem of a question(which I must admit is a good one!) came up...
My initial thoughts was that it would print out "9 sportscar", because even though c is a "Car", the "sportscar" has both the gear ratio and accelerate, so I thought it would use both the variable and method from the subclass.
However, it appears that it will use the variable from the super class, and method from the subclass.
The explanation on the tool isn't that good, it mentions that variables are shadowed and not overridden...can anyone expand on that for me?
The binding of the variables is decided at compile time. So at compile time the compiler knows that c is of type Car and hence use the gerRatio from the Car. But in case of methods the actual version of the method invoked is done at runtime depending on whether the sub class has overridden the method.
Runtime polymorphism applies only to methods. Or in other words 'Dynamic method dispatch' is supported. (Finding the type of object at runtime and invoking the corresponding method)
In the case of variables, its always the 'reference type'. There's no such thing as 'Runtime Variable Dispatch'.. Everything is resolved at compile-time when it comes to variables
Now to shadowing:
What happens, if you have a variable by the same name in the superclass and the subclass and what if they were initialized with different values ?
Well, its all about the reference type with which the variable is accessed. If accessed with a reference of the superclass, you get the value you initialized with in the superclass
If accessed with a reference of the subclass, you get the value you intialized with in the subclass. The actual type of the object doesn't matter (Whichever subclass object be assigned to the reference). Only the reference type matters.
To say that gearRatio is shadowed in SportsCar, it means that the superclass's value is bypassed and the new value defined in the SportsCar is used. The word 'overriding' is avoided here as 'overriding' is a term that is tightly used along with 'runtime polymorphism'. And that isn't the case here