2010-03-17 11 views

Respuesta

23

Porque la herencia tiene la intención de modificar el comportamiento. El comportamiento se expone a través de métodos, y es por eso que pueden ser anulados.

Los campos no son de comportamiento sino de estado. No necesita modificar eso, ni los métodos privados empleados por la superclase. Están destinados a permitir que la superclase haga su trabajo.

28

Puede ocultar un campo, pero no anular it.

Ocultar significa que un campo tendrá un valor diferente según la clase a la que se acceda. El campo en la subclase "ocultará" el campo en la superclase, pero ambos existen. Se accede

public class HideField { 

    public static class A 
    { 
     String name = "a"; 

     public void doIt1() { System.out.println(name); }; 
     public void doIt2() { System.out.println(name); }; 
    } 

    public static class B extends A 
    { 
     String name = "b"; 

     public void doIt2() { System.out.println(name); }; 
    } 

    public static void main(String[] args) 
    { 
     A a = new A(); 
     B b = new B(); 

     a.doIt1(); // print a 
     b.doIt1(); // print a 
     a.doIt2(); // print a 
     b.doIt2(); // print b <-- B.name hides A.name 
    } 
} 

Dependiendo de si el método se overriden, el campo en A o B:

Esa es una muy mala práctica de ocultar campo, pero funciona.

¡Nunca hagas eso! Nunca es la solución a su problema y crea errores muy sutiles relacionados con la herencia.

+0

Oh, para múltiples votaciones por el consejo imperativo de NO HACER ESTO. Es como un señor supremo malvado transformándose en una serpiente ... Nunca ayuda. –

+0

Hay razones sutiles por las que le gustaría: especialmente con los campos de clases estáticas a los que accede mediante el uso específico del nombre de la superclase o de la subclase. "Nunca" nunca es bueno decir;) – RichieHH

+0

Usar estática es otra cosa, Oracle tiene la misma sugerencia con @ewernli: http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html – MengT

1

Porque:

  • Se puede romper el código parent class. Por ejemplo considere siguiente código (¿Cuál sería el comportamiento de la línea obB.getInt(); en el seguimiento de código si, se permite variables de instancia primordiales):

    class A 
    { 
        int aInt; 
    
        public int getInt() 
        { 
         return aInt; 
        } 
    } 
    
    class B extends A 
    { 
        int aInt; 
    
        public int getInt2() 
        { 
         return aInt; 
        } 
    
        public static void main(String[] args) 
        { 
         B obB = new B(); 
    
         //What would be behavior in following line if, 
         //instance variables overriding is allowed 
         obB.getInt(); 
        } 
    } 
    
  • No es lógica porque child class deberían tener/reflejar todos los comportamientos de parent class.

Por lo tanto, sólo se puede ocultar los métodos/las variables heredadas en child class pero no puedo override.

que sigue es un extracto de Java doc from Oracle especificando qué operación se puede realizar/esperar de child class:

Se pueden utilizar los miembros heredados como es, reemplazarlos, ocultarlos, o complementarlos con los nuevos miembros :

  • Los campos heredados se pueden usar directamente, como cualquier otro campo.
  • Puede declarar un campo en la subclase con el mismo nombre que el de la superclase, de modo que lo oculte (no se recomienda).
Cuestiones relacionadas