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 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
Publicar un comentario