simple sencillo poo polimorfismo introduccion herencia ejercicios ejemplos ejemplo java inheritance polymorphism field hiding

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.