2012-09-03 65 views
6

Dentro de una clase, un campo que tiene el mismo nombre que un campo en la superclase oculta el campo de la superclase.Ocultar campos en herencia de Java

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 para mí?

+1

De acuerdo con su comprensión, lo que significa esconderse y heredar; ¿Por qué crees que los valores son como son? Deberías poder resolver esto por ti mismo. –

+0

¿Es esta tarea? –

+0

Un hijo no es un tipo de padre – jsj

Respuesta

8

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? 
+0

¿Solo en java? cualquier otro idioma proporciona polimorfismo en los campos? – UnKnown

2

Según Overriding and Hiding Methods

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 anula en la subclase a través de una referencia superclase se invoca el método de superclase y acceder a los miembros de super clase.

Esto explica siguiente como 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? 

mismo modo para el siguiente:

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

desde getJ() no está definido en Son una versión Father se invoca que ve miembro definido en la clase Father.

Si lees Hiding Fields; específicamente no recomiendan un método de codificación como

En general, no recomendamos ocultar campos ya que hace que el código sea difícil de leer.