Herencia
Si se supone que somos buenos programando, cuando creemos una clase es
posible que sea algo útil. De modo que cuando estemos haciendo un programa
distinto y necesitemos esa clase podremos incluirla en el código de ese nuevo
programa. Es la manera más sencilla de reutilizar una clase.
También es posible que utilicemos esa clase incluyendo instancias de la
misma en nuevas clases. A eso se le llama composición. Representa una relación
"tiene un". Es decir, si tenemos una clase Rueda
y una clase Coche, es de esperar que la clase
Coche tenga cuatro instancias de
Rueda:
class Coche {
Rueda rueda1, rueda2, rueda3, rueda 4;
...
}
Sin embargo, en ocasiones, necesitamos una relación entre clases algo más
estrecha. Una relación del tipo "es un". Por ejemplo, sabemos bien que un gato
es un mamífero. Sin embargo es también un concepto más específico, lo que
significa que una clase Gato puede compartir con
Mamifero propiedades y métodos, pero también
puede tener algunas propias.
Herencia.java
class Mamifero {
String especie, color;
}
class Gato extends Mamifero {
int numero_patas;
}
public class Herencia {
public static void main(String[] args) {
Gato bisho;
bisho = new Gato();
bisho.numero_patas = 4;
bisho.color = "Negro";
System.out.println(bisho.color);
}
}
Como vemos en el ejemplo, el objeto bisho no sólo tiene la propiedad
numero_patas, también color que es una propiedad
de Mamifero. Se dice que
Mamifero es la clase padre y
Gato la clase hija en una relación de herencia.
Esta relación se consigue en Java por medio de la palabra reservada
extends.
Pero, además de heredad la funcionalidad de la clase padre, una clase hija
puede sobreescribirla. Podemos escribir un método en la clase hija que tenga
el mismo nombre y los mismos parámetros que un método de la clase padre:
Herencia.java
class Mamifero {
String especie, color;
public void mover() {
System.out.println("El mamífero se mueve");
}
}
class Gato extends Mamifero {
int numero_patas;
public void mover() {
System.out.println("El gato es el que se mueve");
}
}
public class Herencia {
public static void main(String[] args) {
Gato bisho = new Gato();
bisho.mover();
}
}
Al ejecutar esta nueva versión veremos que se escribe el mensaje de la
clase hija, no el del padre.
Conviene indicar que Java es una lenguaje en el que todas las clases son
heredadas, aún cuando no se indique explícitamente. Hay una jerarquía de objetos
única, lo que significa que existe una clase de la cual son hijas todas las
demás. Este Adán se llama Object y, cuando no
indicamos que nuestras clases hereden de nadie, heredan de él. Esto permite que
todas las clases tengan algunas cosas en común, lo que permite que funcione,
entre otras cosas, el recolector de basura.