ocultación versus redefinición

No es lo mismo ocultar que redefinir.

Ocultación

La subclase puede ocultar

·         variables (de clase y de objeto)

·         métodos estáticos

a base de definir

·         variables con el mismo nombre

·         métodos con la misma signatura

Se puede acceder a los elementos de la superclase vía upcasting, creando una variable de la clase que necesitamos

Redefinición (ver Polimorfismo)

La subclase puede redefinir

·         métodos de objetos

a base de definir métodos con la misma signatura

·         mismo nombre

·         mismo número y tipo de argumentos

·         igual o menos excepciones

·         igual o más visible
“de paquete” < protected < public

·         igual resultado

Sólo hay una forma de acceder al método de la superclase:

super.metodo(argumentos)

y sólo puede accederse a los métodos de la superclase inmediatamente superior a donde nos encontramos.

Intentaremos mostrar mediante un ejemplo la sutil diferencia entre ocultar y redefinir.

class Madre

public class Madre {

 

  public static String getClase() { return "clase Madre"; }

 

  public String getObjeto() { return "objeto de clase Madre"; }

}      

class Hija

public class Hija extends Madre {

 

  // oculta

  public static String getClase() { return "clase Hija"; }

 

  @Override

  public String getObjeto() { return "objeto de clase Hija"; }

}          

class Madres_Hijas

public class Madres_Hijas {

  public static void main(String[] argumentos) {

    Madre madre = new Madre();

    System.out.println("madre.getClase()    -> " + madre.getClase());

    System.out.println("madre.getObjeto()   -> " + madre.getObjeto());

 

    Hija hija = new Hija();

    System.out.println("hija.getClase()     -> " + hija.getClase());

    System.out.println("hija.getObjeto()    -> " + hija.getObjeto());

 

    Madre confusa = new Hija();                  // upcasting

    System.out.println("confusa.getClase()  -> " + confusa.getClase());

    System.out.println("confusa.getObjeto() -> " + confusa.getObjeto());

  }

}              

ejecución

$ java Madres_Hijas

madre.getClase()    -> clase Madre

madre.getObjeto()   -> objeto de clase Madre

 

hija.getClase()     -> clase Hija

hija.getObjeto()    -> objeto de clase Hija

 

confusa.getClase()  -> clase Madre

confusa.getObjeto() -> objeto de clase Hija

 

Nótese que java usa una variable, confusa, definida como Madre, pero referenciando un objeto de clase Hija. El upcasting resuelve diferentemente el caso de los métodos ocultos y el de los redefinidos.

Temas relacionados

87. Herencia [inheritance] (concepto)