25. Java: herencia

El principio de herencia en Java

Tras haber visto el principio de encapsulación, nos toca ahora ver el principio de herencia.

El mecanismo de herencia, permite que una clase herede los atributos y los métodos de otra clase.

La sintaxis en Java para que una clase extienda a otra es esta:

  class <Clase_hija> extends <Clase_madre> {
    ...
  }

Ejem.:

  class B extends A {
    ...
  }

Decimos entonces que la clase B extiende de la A.

Cuando una clase B extiende a la clase A tambien podemos usar alguna de estas expresiones:
  • La clase B deriva de la clase A.
  • La clase B es una subclase de la clase A. 
  • La clase B es hija de la clase A.
  • La clase A es la clase base de B
  • La clase A es una superclase de la clase B.
  • La clase A es madre de la clase B.

¿Qué implica la herencia?

Cuando una clase hereda de otra, la clase hija hereda los atributos y los métodos de la clase madre.


Ejem.:


Clases hijas resultantes (Taxi y Autobus):


NOTA ACLARATORIA: viendo la imagen anterior, se podría pensar que los métodos y las variables se añaden al código de la clase hija, pero eso no llega nunca a ocurrir. Es decir, los atributos y los métodos se heredan, pero NO forman parte materialmente del código de la clase hijas.


Acceso a los atributos "private" y "protected" desde dentro de la clase hija

El hecho de una clase herede a otra no implica siempre podamos acceder desde dentro de la clase hija directamente a los atributos de la clase madre. Veamoslo con un ejemplo:

Siguiendo el esquema de herencia de los vehículos, este sería una parte de la definición de la clase Vehiculo:


Como vemos, dentro de la clase Vehiculo hemos definido el atributo "matricula". Veamos que ocurre si dentro de un método de la clase Taxi hacemos referencia al atributo de matricula de la clase Vehiculo:

Como podemos, el atributo "matricula" aparece en rojo, por no es accesible desde la clase hija "Taxi" ya que en Vehiculo es un atributo "private".

Si quisiesemos que sí se puedise acceder al atributo "matricula" desde la clase "Taxi", tendriamos que declararlo "protected" en "Vehiculo":

En ese caso, si acudimos a la clase Taxi, veremos que la referencia al atributo "matricula" ha dejado de estar en rojo:






Otros ejemplos:
  


Clases hijas de la clase Mascota

Clases hijas de la clase Vehiculo
Clases hijas de la clase Carro (Coche)
Herencia multinivel



Herencia multinivel

El mecanismo de herencia se puede aplicar de manera encadenada. Ejem.:

Definición de clases en Java:

  class A {
    ...
  }

  class B extends  A {
    ...
  }

  class C extends B {
    ...
  }


Redefinición de métodos en la clase hija

Cuando una clase hija hereda un método cuyo código no realiza exactamente lo que un objeto de la clase hija necesita, es posible redefinirlo. Veamos un ejemplo:

Imaginemos que en el caso de los objetos Taxi, queremos el método getMatricula() imprima por consola "Matrícula taxi: XXXXX", además de, por supuesto, devolver el valor del atributo matrícula. En ese caso, deberemos de redefinir el método getMatricula() en la clase Taxi así:



De esta manera, cuando instanciemos la clase Taxi, y llamemos a su método getMatricula(), estaremos en realidad llamando al método getMatricula() de la clase "Taxi".

Taxi taxiSolicitado = new Taxi();
//esto imprime tambien "Matricula taxi: XXXXXXXX"
String matricula = taxiSolicitado.getMatricula();

Cuando redefinimos un método de la clase madre, es recomendable que añadamos "@Override" encima de la redefinición del método en la clase hija. Ejem:




¿Por que es recomendable? Cuando un método de una clase madre, se sobreescribe, es necesario que el prototipo del método (nombre de la función + parametros) en la clase hija sea el mismo. Por ejemplo, la siguiente redefinición del método onCreate() de la anterior imagen, daría error:

Como se puede apreciar, debajo de "@Override" aparece una linea roja, que nos indica que hay algo erroneo. Si ponemos el raton encima de dicha linea, aparecera un mensaje que dice "Method does not override method from its superclass":


Comentarios

Entradas populares de este blog

29. Android: tipos de layouts

5. CSS: formatear un documento HTML

34. Java: final, static, constantes, colecciones