9

This is a question just out of curiosity.

I know that when we call a subclass object's overridden method by the reference of it's superclass, JVM gives importance to the type of object and not to type of reference.

This is my simple code :

class Animal
{
    void eat()
    {
        System.out.println("Animal is eating...");
    }
}
class Horse extends Animal
{
    @Override
    void eat()
    {
        System.out.println("Horse is eating...");
    }
}
public class PolymorphismTest
{
    public static void main(String...args)
    {
        Animal a=new Animal();
        a.eat();

        Animal h= new Horse();
        h.eat();
    }
}

As expected, I get the output :

run:
Animal is eating...
Horse is eating...
BUILD SUCCESSFUL (total time: 0 seconds)

Now my question is , Is there any way that we can use reference h to call the superclass eat() method and not the subclass one? I know this is a question that is somewhat against the laws of polymorphism but you never know when the need may arise to do so.

I tried to typecast the reference h to Animal but no luck. Any ideas?

4
  • Possible duplicate of stackoverflow.com/questions/5411434/… Commented Jun 11, 2012 at 18:11
  • 2
    And also possible duplicate of stackoverflow.com/questions/1032847/… Commented Jun 11, 2012 at 18:13
  • I agree. Sorry for not going through it. I did some research but could not find this. Commented Jun 11, 2012 at 18:13
  • 1
    Jon Skeet (obviously) gave a really good answer Commented Jun 11, 2012 at 18:13

4 Answers 4

5
class Horse extends Animal
{
    @Override
    void eat()
    {
        super.eat();
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

Yes, one shouldn't call the parent class' implementation in order to adhere to the laws of polymorphism. I will re-paste this link: stackoverflow.com/questions/1032847/…
4

No, you'll have to explicitly do so in the overridden method (i.e. super.eat()).

Comments

2

You cannot do this by doing any form of typecasting. Your only way to call the method of the superclass is to either wrap it like Brett Holt showed, or you must have an object whose most specific runtime type is Animal.

Comments

2

In Java - All the methods are virtual methods that is most recent implementation is used while calling the function.

To answer your question, please make the method static in Animal class then you will get the eat method of Animal class called.

static void eat(){ 
      System.out.println("Animal is eating..."); 
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.