La Herencia en Java. Curso de Java
Para entender que és la herencia en java la mejor forma es razonarlo desde el punto de vista de los objetos creados.
Cada objeto creado de una Clase determinada tiene el estado y comportamiento de esa Clase en particular. En ocasiones nos puede interesar crear distintos objetos con sus comportamientos específicos, que tengan comportamientos comunes a otros objetos. En este sentido entra en juego la herencia entre Clases de Java. Por ejemplo si nos fijamos en un vehículo a motor (un coche), distinguimos partes comunes a otros coches. Como pueden ser el «numero de ruedas», «el volante», «cambio de marchas», etc. Factores que son comunes en cada «objeto coche» que se fabrica.
Sin embargo especificando en cada objeto coche en particular, hay variaciones en sus características de fabricación. Estas pueden ser, si es «Turismo o deportivo», «cilindrada», «la forma», que son atributos de cada tipo de objeto coche. Esto se puede ver mejor en la siguiente representación:
En este diagrama de clases de uml vemos una representación del concepto de herencia en Java . La Clase madre o Superclase ClaseCoche con sus atributos y dos Clases que heredan de ella. La Clase ClaseTurismo y la Clase ClaseDeportivo.
Ambas Clases tienen los atributos y métodos (si los hubiera) de la Clase ClaseCoche. Aparte cada una de estas clases hijas aporta los atributos y métodos que tengan. Si instanciamos un objeto de la clase «ClaseTurismo» , accederiamos a «isFamiliar» y al resto de miembros de la SuperClase.
En Java, a cada clase se le permite tener una Superclase , en cambio una superclase puede tener infinitas subclases.
¿Como hacer que una Clase herede de otra?
Para crear una subclase hay que utilizar la palabra reservada extends en la cabecera de la clase que hereda de la siguiente manera:
1 2 3 4 5 6 7 8 9 10 11 12 | class ClaseTurismo extends ClaseCoche { // Todo el código de la clase aquí (atributos, constructores y otros métodos) } class ClaseDeportivo extends ClaseCoche { // Todo el código de la clase aquí (atributos, constructores y otros métodos) } |
En el lenguaje Java existe una jerarquia de Clases y encabezando está la clase Object,. A partir de ella se crea una estructura de niveles de herencias.
Una subclase hereda todos los miembros de la superclase a excepción de los métodos constructores, sin embargo puede accederse a ellos utilizando una invocación al mismo con la palabra reservada super, de la siguiente manera:
Ejemplo de uso de «super» en la herencia de Clases.
Primeramente creamos una clase cualquiera, en este caso la llamaremos por ejemplo CCoche
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package cursojavaherencia; /** * * @author hachetml.com */ public class CCoche { //Campo o atributo de clase private String color; //Constructor de la Clase Madre public CCoche(String color) { this.color = color; } //Un método cualquiera public void estaDisponible() { if(color=="azul" || color=="verde"){ System.out.println("Su coche de color: " +color+ " esta disponible"); }else{ System.out.println("Su coche de color: " +color+ " no esta disponible"); } } } |
A continuación declaramos la clase CDeportivo que hereda de CCoche:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | package cursojavaherencia; /** * * @author hachetml.com */ public class CDeportivo extends CCoche{ //Campo o atributo de clase private String color; // Constructor de la clase public CDeportivo(String color) { super(color); //Llamada al constructor de la superclase this.color = color; } public void setColor(String color) { this.color = color; } //Un método cualquiera public void estaDisponible() { if(color=="azul" || color=="verde"){ System.out.println("Su coche de color: " +color+ " esta disponible"); super.estaDisponible(); }else{ System.out.println("Su coche de color: " +color+ " no esta disponible"); super.estaDisponible(); } } } |
Finalmente en la clase principal donde esta el método main creamos los objetos y lá logica del programa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package cursojavaherencia; /** * * @author hachetml.com */ public class CursoJavaHerencia { public static void main(String[] args) { // Creamos los objetos CCoche objCoche = new CCoche("azul"); CDeportivo objDep = new CDeportivo("verde"); System.out.println("objCoche"); System.out.println("-------------"); objCoche.estaDisponible(); // Llamada a estaDisponible() de CCoche System.out.println(); System.out.println(); System.out.println("objDeportivo"); System.out.println("-------------"); objDep.estaDisponible(); // Llamada a estaDisponible() de CDeportivo System.out.println(); System.out.println(); System.out.println("objDeportivo"); System.out.println("-------------"); objDep.setColor("gris"); //Cambiamos valor del atributo "color" en CDeportivo objDep.estaDisponible(); // Llamada a estaDisponible() de CDeportivo } } |
Si ejecutamos este programa obtendremos en consola el siguiente resultado:
Aclaraciones:
- Primero: Creamos un objeto de cada clase «objCoche» y «objDeportivo» llamando al constructor respectivo. Y pasamos como parámetro el valor de «color».
- Segundo: Desde «objCoche» invocamos el método «estaDisponible» de la clase «CCoche».
- Tercero: Desde «objDep» invocamos el método «estaDisponible» de la clase «CDeportivo». Este muestra primeramente un mensaje en consola y después llama al método «estaDisponible» de la «Superclase» CCoche. Pero si nos damos cuenta el atributo «color» ha variado de «azul», a «verde». Esto se debe a la llamada que se hace al constructor al crear objDep y pasar el parametro «color=verde».
- Cuarto: Se le asigna un nuevo valor al atributo «color» de la clase CDeportivo llamando a su método «setColor». Como vemos en consola solamente aplicariamos el cambio al atributo miembro de su misma clase y no a la Superclase.
Conclusiones sobre la herencia en Java.
- Una subclase hereda los miembros públicos y protegidos de la «Superclase» si está en el mismo paquete.
- Los miembros privados solamente se heredan si están en mismo paquete.
- Pueden utilizarse mismo nombre para designar miembros tanto en la «superclase» como la subclase, esto responde al concepto de ocultación de miembros de la superclase.
- Se pueden crear tantos atributos o métodos en la subclase como consideremos oportuno y a su vez poder utilizar todos los miembros de la «Superclase».
- Tal y como hemos visto en el programa de ejemplo anterior, podemos invocar al constructor o a cualquier método de la «Superclase» utilizando la palabra reservada «super», con la salvedad de que si invocamos al constructor de la Superclase desde el constructor de la subclase la llamada con «super» necesariamente debe estar situada en la primera linea del método constructor de la subclase.