La herencia en Java permite que una clase herede atributos y métodos de otra clase base. La clase Horas hereda de la clase UnidadDeTiempo, por lo que obtiene sus métodos forward() y reset() sin tener que reescribir el código. La herencia permite extender la funcionalidad de una clase padre añadiendo nuevos atributos y métodos a la clase hija. La composición se usa cuando se quiere incluir las características de una clase en otra sin heredar su interfaz, mientras que la herencia crea una ver
1. Herencia
En java aunque no establezcamos de manera explícita la herencia siempre está presente, ya que
todas las clases que creemos heredan de la clase Object, por eso es válido decir que en java todo
es un objeto. La sintaxis para la composición es obvia pero, para realizar la herencia, hay una forma
claramente distinta. Cuando heredamos, estamos diciendo "Esta nueva clase es como esa clase
antigua", por ejemplo es decir que la clase Horas “es una” UnidadDeTiempo. Afirmamos esto en el
código dando el nombre de la clase como siempre pero, antes de la apertura del límite cuerpo de
clase, pondremos la palabra clave "extends" seguida por el nombre de la clase base. Cuando
hagamos esto, obtendremos automáticamente todos los datos miembros y métodos de la clase base.
Primero veamos como seria la clase UnidadDeTiempo:
public class UnidadDeTiempo {
int valor;
int tope;
public int forward(){
if(valor == tope)
valor=0;
else
valor++;
return valor;
}
public int reset(){
valor=0;
return valor;
}
}
Y nuestra clase Horas:
public class Horas extends UnidadDeTiempo{
public Horas() {
this.valor=0;
this.tope=23;
}
}
2. De esta manera sin necesidad de tener que escribir nuevamente todos el código de UnidadDeTiempo
lo tememos disponible en la clase Horas, pero que partes tenemos disponibles?, todos los atributos
y los métodos de la clase padre están disponibles en la clase hija pero dependiendo de los
modificadores de acceso o visibilidad de estos, por ejemplo los atributos y métodos de tipo friendly
solo estarán disponibles para las clases hijas que heredan de una clase padre en el mismo paquete,
los atributos y métodos de tipo public estarán disponibles para todas las clases que hereden de la
clase padre sin importar que se halle o no en el mismo paquete; los miembros protected también son
accesibles
desde
las
clases
hijas.
El código de nuestras clases hijas no tienen porque limitarse solo al código heredado, de hecho casi
siempre la herencia se hace para extender la funcionalidad de las clases heredadas añadiendo
nuevos
métodos
y
atributos.
La composición y la herencia
Tanto la composición como la herencia permiten poner sub-objetos dentro de tu nueva clase.
Podríamos preguntarnos cuál es la diferencia entre los dos, y cuándo elegir uno en lugar del otro. La
composición es generalmente usada cuando deseamos las características de una clase existente
dentro de una nueva clase, pero no su interfaz. Es decir, ponemos un para poder usarlo para
implementar características de nuestra nueva clase, pero el usuario de esa nueva clase verá el
interfaz
que
hemos
definido
en
lugar
del
interfaz
del
objeto
insertado.
Los objetos miembros usan la implementación ocultándose a sí mismos, por lo que esto es una cosa
segura a hacer y, cuando el usuario sabe que estamos uniendo un conjunto de partes, hace que el
interfaz
sea
más
fácil
de
entender.
Cuando heredamos, estamos cogiendo una clase existente y creando una versión especial de esa
clase. En general, esto significa que estamos tomando una clase de propósito general,
especializándola para un caso o necesidad particular. Pensando un poco, podrá entender que no
tendría sentido construir un coche usando un objeto vehículo (un coche no contiene un vehículo, ¡es
un vehículo!). La relación es- un viene expresada por la herencia, y la relación tiene un viene
expresada por la composición.