sencillo - introduccion de herencia en java
Ocultar campos en herencia de Java (2)
Dentro de una clase, un campo que tiene el mismo nombre que un campo en la superclase oculta el campo de la superclase.
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;
}
}
¿Alguien puede explicar los resultados por mí?
En java, los campos no son polimórficos.
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?
De acuerdo con los métodos de anulación y ocultación
La versión del método oculto que se invoca depende de si se invoca desde la superclase o la subclase.
es decir, cuando se invoca un método que se invalida en la subclase a través de una referencia de superclase, se invoca el método de superclase y se accede a los miembros de la superclase.
Esto explica a continuación ya que la referencia utilizada es de superclase:
System.out.println(father.i); //why 1?
System.out.println(father.j); //why 10?
System.out.println(father.getJ()); //why 10?
Del mismo modo para lo siguiente:
System.out.println(son.getJ()); //why 10?
como getJ()
no está definido en Son
se invoca una versión de Father
que ve al miembro definido en la clase de Father
.
Si lees Ocultar campos ; específicamente no recomiendan un método de codificación como
En términos generales, no recomendamos ocultar campos ya que hace que el código sea difícil de leer.