Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2.4. HERENCIA
FUNDAMENTOS DE LA HERENCIA.
La herencia es uno de los principios
fundamentales de la programación
orientada a objetos porque permite la
creación de clasificaciones jerárquicas.
Con el uso de la herencia puede crear una
clase general que defina rasgos comunes
a un conjunto de elementos relacionados.
Luego, otras clases más específicas
pueden heredar esta clase y agregar cada
una de ellas lo que las hace únicas.
En el lenguaje Java, a una clase que se hereda se le conoce como superclase. A la clase que recibe
la herencia se le denomina subclase. Por lo tanto, una subclase es una versión especializada de
una superclase. Hereda todas las variables y los métodos definidos por la superclase (excepto los
declarados como privados) y agrega sus propios elementos únicos.
Java soporta la herencia al permitir que una clase incorpore a otra su declaración. Esto se hace
mediante el uso de la palabra clave extends. Así, la subclase se añade (extiende) a la superclase.
Al implementar Herencia se utilizan cualquiera de los nombres siguientes:
Observe que la flecha de herencia parte de la subclase y la punta de la flecha señala la superclase.
La especialización se refiere a que la clase es más detallada respecto a los elementos que contiene
y aparece en las clases que se encuentran en los niveles más bajos de un esquema de herencia,
mientras que la generalización es el concepto opuesto (contiene elementos generales y se
encuentra en los niveles más altos de un esquema de herencia.
Página 1 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
TemDeseada -TemDeseada = 22
TempMuestreada +TempMuestreada: Temp
Página 2 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
Java permite implementar herencia Lineal y Jerárquica pero no herencia Múltiple, aunque permite
implementar múltiples interfaces.
Ejemplo:
class FormaDosD {
double ancho;
double alto;
void mostrarDim() {
System.out.println("El ancho es " + ancho + "\ny el alto es " + alto);
}
}
double area() {
return ancho * alto / 2;
}
void mostrarEstilo() {
System.out.println("El triángulo es " + estilo);
}
}
t1.ancho = 4.0;
t1.alto = 4.0;
t1.estilo = "Isósceles";
t2.ancho = 8.0;
t2.alto = 12.0;
t2.estilo = "Recto";
System.out.println();
System.out.println("Info para t2");
t2.mostrarEstilo();
t2.mostrarDim();
System.out.println("El área es " + t2.area());
}
}
Página 3 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
class FormaDosD2 {
private double ancho;
private double alto;
double getAncho() {
return ancho;
}
double getAlto() {
return alto;
}
void mostrarDim() {
System.out.println("El ancho es " + ancho + "\ny el alto es " + alto);
}
}
String estilo;
double area() {
return getAncho() * getAlto() / 2;
}
Página 4 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
void mostrarEstilo() {
System.out.println("El triángulo es " + estilo);
}
}
t1.setAncho(4.0);
t1.setAlto(4.0);
t1.estilo = "Isósceles";
t2.setAncho(8.0);
t2.setAlto(12.0);
t2.estilo = "Recto";
CONSTRUCTORES Y HERENCIA
En una jerarquía es posible tener constructores tanto para la superclase como para la subclase.
Esto plantea una importante pregunta: ¿cuál constructor es responsable de construir un objeto de
la subclase – el de la superclase, el de la subclase o ambos? La respuesta es la siguiente: el
constructor de la superclase construye la porción de la superclase del objeto y el constructor de la
subclase construye la porción de la subclase del objeto. Esto tiene sentido porque la superclase no
tiene conocimiento o acceso a ninguno de los miembros de la subclase. Por tanto, su construcción
debe ser separada.
Cuando sólo la subclase define un constructor, el proceso es muy sencillo: simplemente construya
el objeto de la subclase. La porción de la superclase es construida automáticamente usando su
constructor por defecto.
Sin embargo, cuando la subclase y la superclase definen constructores, el proceso se vuelve un
poco más complicado porque ambos constructores deben ejecutarse. En este caso, debe usar la
palabra reservada super para llamar al constructor de la superclase.
Página 5 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
NOTA:
La palabra reservada super siempre hace referencia a la superclase inmediata superior de la clase
que llama y siempre debe ser la primera instrucción ejecutada dentro del constructor de la
subclase.
Ejemplo:
class FormaDosD3 {
private double ancho;
private double alto;
double getAncho() {
return ancho;
}
double getAlto() {
return alto;
}
void mostrarDim() {
System.out.println("El ancho es " + ancho + "\ny el alto es " + alto);
}
}
double area() {
return getAncho() * getAlto() / 2;
}
void mostrarEstilo() {
System.out.println("El triángulo es " + estilo);
}
Página 6 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
setAlto(alto);
}
}
double getAncho() {
return ancho;
}
double getAlto() {
return alto;
}
Página 7 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
void mostrarDim() {
System.out.println("El ancho es " + ancho + "\ny el alto es " + alto);
}
double area() {
return getAncho() * getAlto() / 2;
}
void mostrarEstilo() {
System.out.println("El triángulo es " + estilo);
}
SOBRECARGA DE CONSTRUCTORES.
Puede agregar más de un constructor a la clase, ya que Java ejecutará el constructor que coincida
con los argumentos, tal como se muestra a continuación.
class FormaDosD5 {
private double ancho;
private double alto;
Página 8 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
double getAncho() {
return ancho;
}
double getAlto() {
return alto;
}
void mostrarDim() {
System.out.println("El ancho es " + ancho + "\ny el alto es " + alto);
}
FormaDosD5() {
ancho = alto = 0.0;
}
FormaDosD5(double x) {
ancho = alto = x;
}
double area() {
return getAncho() * getAlto() / 2;
}
void mostrarEstilo() {
System.out.println("El triángulo es " + estilo);
}
Página 9 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
Triang5() {
super();
estilo = "nulo";
}
Triang5(double x) {
super(x);
estilo = "Isósceles";
}
t1 = t2;
// El primer objeto es sujeto a eliminación después de esta línea
// Ahora el segundo objeto tiene dos referencias: t1 y t2
t1.setAncho(100);
Página 10 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
/*
Como es de esperar, la información mostrada a partir de la referencia t2
evidencia el cambio hecho desde la referencia t1. Esto tiene sentido
porque ambas referencias apuntan al mismo objeto.
Hija(int a, int b) {
super.var1 = a; // propiedad var1 de la clase Padre
var1 = b; // propiedad var1 de la clase Hija
}
void mostrar() {
System.out.println("var1 en la superclase: " + super.var1);
System.out.println("var1 en la subclase: " + var1);
}
}
ob1.mostrar();
}
}
Página 11 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
double getAncho() {
return ancho;
}
double getAlto() {
return alto;
}
void mostrarDim() {
System.out.println("El ancho es " + ancho + "\ny el alto es " + alto);
}
FormaDosD6() {
ancho = alto = 0.0;
}
FormaDosD6(double x) {
ancho = alto = x;
}
Página 12 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
double area() {
return getAncho() * getAlto() / 2;
}
void mostrarEstilo() {
System.out.println("El triángulo es " + estilo);
}
Triang6() {
super();
estilo = "nulo";
}
Triang6(double x) {
super(x);
estilo = "Isósceles";
}
void mostrarColor() {
System.out.println("El color es: " + color);
}
}
Página 13 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
t2.mostrarColor();
System.out.println("El área es " + t2.area());
}
}
SOBRESCRITURA DE MÉTODOS
Aparte de las conversiones estándar y las promociones automáticas que se aplican a los tipos
primitivos, la compatibilidad de tipo está estrictamente impuesta. Por lo general, una variable de
referencia para un tipo de clase no tiene la capacidad de hacer referencia a un objeto de otro tipo
de clase.
Por ejemplo:
class PadreV1 {
int var1, var2;
PadreV1(int a, int b) {
var1 = a;
var2 = b;
}
void mostrar() {
System.out.println("var1 = " + var1 + "\ny var2 = " + var2);
}
}
void mostrar() {
System.out.println("var3 = " + var3);
}
}
Página 14 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
Por ejemplo:
class HijaV1 extends PadreV1 {
int var3;
void mostrar() {
super.mostrar(); // Esta línea llama a mostrar() en Padre1
System.out.println("var3 = " + var3);
}
}
La sobrescritura de métodos sólo ocurre cuando los tipos de regreso y las firmas de los dos
métodos son idénticos. Si no lo son, entonces los dos métodos simplemente están sobrecargados.
Por ejemplo:
class PadreV2 {
int var1, var2;
PadreV2(int a, int b) {
var1 = a;
var2 = b;
}
void mostrar() {
System.out.println("var1 = " + var1 + "\ny var2 = " + var2);
}
}
Página 15 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
double getAncho() {
return ancho;
}
double getAlto() {
return alto;
}
Página 16 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
void mostrarDim() {
System.out.println("El ancho es " + ancho + "\ny el alto es " + alto);
}
FormaDosD7() {
ancho = alto = 0.0;
}
FormaDosD7(double x) {
ancho = alto = x;
}
double area() {
return getAncho() * getAlto() / 2;
}
void mostrarEstilo() {
System.out.println("El triángulo es " + estilo);
}
Triang7() {
super();
estilo = "nulo";
}
Triang7(double x) {
super(x);
estilo = "Isósceles";
}
Página 17 de 18
Universidad Tecnológica de El Salvador
Programación III MSc. René Alberto Castro Velásquez
Triang7(Triang7 ob) {
super(ob);
this.estilo = ob.estilo;
}
}
t1.setAncho(100);
/*
Como es de esperar, la información mostrada a partir de la referencia t2
no presenta ningún cambio porque apunta hacia un objeto diferente
al que apunta la referencia t1,a pesar de haber sido construido
usando la información del primer objeto.
Página 18 de 18