Lostlinkpr Lostlinkpr - 10 months ago 44
Java Question

Overriding vs Hiding Java - Confused

I'm confused on how Overriding differs from Hiding in Java. Can anyone provide more details on how these differ? I read the Java Tutorial but the sample code still left me confused.

To be more clear, I understand Overriding well. My issue is that I don't see that hiding is any different except for the fact that one is at the instance level while the other is at the class level.

Looking at the Java tutorial code:

public class Animal {
public static void testClassMethod() {
System.out.println("Class" + " method in Animal.");
public void testInstanceMethod() {
System.out.println("Instance " + " method in Animal.");

Then we have a subclass cat:

public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");

public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;

Then they say:

The output from this program is as follows:

The class method in Animal.

The instance method in Cat.

To me, the fact that calling a class method testClassMethod() directly from the Animal class, executes the method in Animal class is pretty obvious, nothing special there. Then they call the testInstanceMethod() from a reference to myCat, so again pretty obvious that the method executed then is the one in the instance of Cat.

From what I see what the call hiding behaves just like overriding, so why make that distinction. If I run this code using the classes above:


I'll get:
The class method in Cat.
But if I remove the testClassMethod() from Cat, then I'll get:
The class method in Animal.

Which shows me that writing a static method, with the same name as in the parent, in a subclass pretty much does an override.

Hopefully I'm making clear my where I'm confused and someone can shed some light. Thanks very much in advance!

Answer Source

Over-riding basically supports late binding . Therefore, which method will be called is decided at run time.It is for non-static methods. Hiding is for all other members (static methods , instance members, static members). It is based on the early binding . More clearly , the method or member to be called or used is decided during compile time.

In your example, the first call , Animal.testClassMethod() is a call to a static method,hence, it is pretty sure as to which method is going to be called.

In the second call,myAnimal.testInstanceMethod(), it calls a non-static method. It is what you call run-time polymorphism. It is not decided until run time which method is to be called.

For further clarification, read this.