问题
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?
回答1:
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?
回答2:
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.
来源:https://stackoverflow.com/questions/12244670/hiding-fields-in-java-inheritance