Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass-by-value & polymorphism [duplicate]

I'm fairly new to programming and do not understand why this code prints 200 instead of 206. The move method in class Cat overrides the move method in class Animals. Why does the 'location' instance variable in Animals not change to 206 after the method call on line 2? However, when I remove the method in class Cat, then the instance variable DOES change to 206. What is the logic behind it?

public  class Animals {
   int location = 200; //line 1

   public void move(int by) {
       location = location+by;
   }

    public final static void main (String...args) {
        Animals a = new Cat();
        a.move(6); //line 2
        System.out.println(a.location); //200, but should print 206 in my opinion
    }
}

class Cat extends Animals {
    int location = 400;

    @Override
    public void move(int by) { //if this method is removed, a.location prints 206
        location = location+by;
    }
}
like image 956
Helenesh Avatar asked Jun 01 '26 13:06

Helenesh


2 Answers

a.move(6); // line 2
System.out.println(a.location);

In first line you are executing the method in Cat, which means you are modifying the variable of Cat class.

In second line you are printing the variable from Animal.

You cannot override variables in Java. Only methods.

And what you did is you shadowed the instance variable location on Cat and when you modify that in your Cat class, you are not pointing to Animal no more. When you remove that variable in Cat class, then you are referring to Animal Class.

like image 67
Suresh Atta Avatar answered Jun 04 '26 03:06

Suresh Atta


The problem is that you define location in both the super class and the subclass. Therefore, there are two different variables. Cat.move modifies Cat.location. However, if you use a base class reference to get location you get the animal's instance location instead of cat's location.

One way to fix it is to mark location protected in Animal and initialise its value (200 or 400) in the default constructor of each class.

like image 29
alampada Avatar answered Jun 04 '26 03:06

alampada