Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hiding Fields in Java Inheritance

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?

like image 217
Wuaner Avatar asked Sep 03 '12 08:09

Wuaner


People also ask

What does it mean to hide a field in Java?

Within a class, a field that has the same name as a field in the superclass hides the superclass's field, even if their types are different. Within the subclass, the field in the superclass cannot be referenced by its simple name.

Is protected fields inherited?

Only public and protected fields are considered inherited.

What does it mean to hide a field?

A hidden field lets web developers include data that cannot be seen or modified by users when a form is submitted. A hidden field often stores what database record that needs to be updated when the form is submitted.

Can you inherit fields in Java?

In the Java language, classes can be derived from other classes, thereby inheriting fields and methods from those classes. Definitions: A class that is derived from another class is called a subclass (also a derived class, extended class, or child class).


2 Answers

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?
like image 156
Nandkumar Tekale Avatar answered Sep 20 '22 21:09

Nandkumar Tekale


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.

like image 32
Bharat Sinha Avatar answered Sep 24 '22 21:09

Bharat Sinha