15

Within a class, a field that has the same name as a field in the superclass hides the superclass's field.

public class Test {

    public static void main(String[] args) {

        Father father = new Son();
        System.out.println(father.i); //why 1?
        System.out.println(father.getI());  //2
        System.out.println(father.j);  //why 10?
        System.out.println(father.getJ()); //why 10?

        System.out.println();

        Son son = new Son();
        System.out.println(son.i);  //2 
        System.out.println(son.getI()); //2
        System.out.println(son.j); //20
        System.out.println(son.getJ()); //why 10?
    }  
}

class Son extends Father {

    int i = 2;
    int j = 20;

    @Override
    public int getI() {
        return i;
    }
}

class Father {

    int i = 1;
    int j = 10;

    public int getI() {
        return i;
    }

    public int getJ() {
        return j;
    }
}

Can someone explain the results for me?

dbc
  • 91,441
  • 18
  • 186
  • 284
Wuaner
  • 891
  • 2
  • 14
  • 30

2 Answers2

14

In java, fields are not polymorphic.

Father father = new Son();
System.out.println(father.i); //why 1? Ans : reference is of type father, so 1 (fields are not polymorphic)
System.out.println(father.getI());  //2 : overridden method called
System.out.println(father.j);  //why 10? Ans : reference is of type father, so 2
System.out.println(father.getJ()); //why 10? there is not overridden getJ() method in Son class, so father.getJ() is called

System.out.println();

// same explaination as above for following 
Son son = new Son();
System.out.println(son.i);  //2 
System.out.println(son.getI()); //2
System.out.println(son.j); //20
System.out.println(son.getJ()); //why 10?
Nandkumar Tekale
  • 15,514
  • 7
  • 56
  • 85
5

As per Overriding and Hiding Methods

The version of the hidden method that gets invoked depends on whether it is invoked from the superclass or the subclass.

i.e. when you invoke a method which is overridden in subclass via a super class reference the super class method is invoked and it access super class members.

This explains following as the reference used is of superclass:

System.out.println(father.i);  //why 1?
System.out.println(father.j);  //why 10?
System.out.println(father.getJ()); //why 10?

Similarly for the following:

System.out.println(son.getJ()); //why 10?

since getJ() is not defined in Son a Father version is invoked which sees member defined in the Father class.

If you read Hiding Fields; they specifically don't recommend such method of coding as

Generally speaking, we don't recommend hiding fields as it makes code difficult to read.

Willi Mentzel
  • 24,988
  • 16
  • 102
  • 110
Bharat Sinha
  • 13,385
  • 6
  • 37
  • 63