Documentos de Académico
Documentos de Profesional
Documentos de Cultura
03-Herencia 3en1 PDF
03-Herencia 3en1 PDF
© M. Aldea y M. González
Prácticas de Programación 8/03/10 1
3.1. Herencia
3.2. Polimorfismo
3.3. La clase Object
3.4. Clases abstractas
3.5. Bibliografía
© M. Aldea y M. González
Prácticas de Programación 8/03/10 2
Relación de herencia:
• todos los coches son vehículos Coche
Nomenclatura
clase original superclase padre Vehículo
clase extendida subclase hijo Coche
© M. Aldea y M. González
Prácticas de Programación 8/03/10 3
Tema 3. Herencia y Polimorfismo
3.1 Herencia
Herencia de operaciones
Al extender una clase
• se heredan todas las operaciones del padre
• se puede añadir nuevas operaciones
© M. Aldea y M. González
Prácticas de Programación 8/03/10 4
Línea Círculo
-puntoInicio -centro
-puntoFin -radio
+dibuja() subclases +dibuja()
+borra() +borra()
+rellena()
© M. Aldea y M. González
Prácticas de Programación 8/03/10 5
Ejemplo
Clase que representa un vehículo cualquiera
Vehículo
-color: int
-numSerie: int
+color(): int
+numSerie(): int
+pinta(nuevoColor: int)
+cambiaNumSerie(nuevo: int)
© M. Aldea y M. González
Prácticas de Programación 8/03/10 6
Tema 3. Herencia y Polimorfismo
3.1 Herencia
// atributos
private int color;
private int numSerie;
© M. Aldea y M. González
Prácticas de Programación 8/03/10 7
/**
* Obtener el numero de serie
*/
public int numSerie()
{
return numSerie;
}
/**
* Obtener el color
*/
public int color()
{
return color;
}
© M. Aldea y M. González
Prácticas de Programación 8/03/10 8
/**
* Cambiar el numero de serie
*/
public void cambiaNumSerie(int numSerie)
{
this.numSerie=numSerie;
}
/**
* Pintar el vehículo de un color
*/
public void pinta(int nuevoColor)
{
color = nuevoColor;
}
}
© M. Aldea y M. González
Prácticas de Programación 8/03/10 9
Tema 3. Herencia y Polimorfismo
3.1 Herencia
Vehículo
-color: int
-numSerie: int
+color(): int
+numSerie(): int Coche
+pinta(nuevoColor: int)
+cambiaNumSerie(nuevo: int) -cilindrada: int
+cilindrada(): int
+cambiaCilindrada(nueva: int)
© M. Aldea y M. González
Prácticas de Programación 8/03/10 10
© M. Aldea y M. González
Prácticas de Programación 8/03/10 11
© M. Aldea y M. González
Prácticas de Programación 8/03/10 12
Tema 3. Herencia y Polimorfismo
3.1 Herencia
-color: int
-numSerie: int
+color(): int
+numSerie(): int
+pinta(nuevoColor: int)
+cambiaNumSerie(nuevo: int)
Coche
-cilindrada: int
© M. Aldea y M. González
Prácticas de Programación 8/03/10 13
© M. Aldea y M. González
Prácticas de Programación 8/03/10 14
Redefiniendo operaciones
Una subclase puede redefinir (“override”) una operación en lugar
de heredarla directamente
© M. Aldea y M. González
Prácticas de Programación 8/03/10 15
Tema 3. Herencia y Polimorfismo
3.1 Herencia
Herencia y Constructores
Los constructores no se heredan
• las subclases deben definir su propio constructor
© M. Aldea y M. González
Prácticas de Programación 8/03/10 17
Vehículo
-color: int
-numSerie: int
+Vehiculo(color: int,
numSerie: int)
+numSerie(): int
+color(): int
+pinta(nuevoColor: int)
+toString(): String
/**
* Constructor al que le pasamos el color
* y el número de serie
*/
public Vehículo(int color, int numSerie) {
this.color = color;
this.numSerie = numSerie;
}
© M. Aldea y M. González
Prácticas de Programación 8/03/10 19
/**
* Obtener un texto con los datos
* del vehículo
*/
public String toString() {
return "Vehículo -> numSerie= "+
numSerie+", color= "+nombre[color];
}
}
© M. Aldea y M. González
Prácticas de Programación 8/03/10 20
/**
* Constructor al que le pasamos el color, el
* numero de serie y la cilindrada
*/
public Coche(int color, int numSerie,
int cilindrada) {
super(color, numSerie);
this.cilindrada = cilindrada;
}
© M. Aldea y M. González
Prácticas de Programación 8/03/10 21
Tema 3. Herencia y Polimorfismo
3.1 Herencia
Ejemplo: Extensión al Coche (cont.)
}
© M. Aldea y M. González
Prácticas de Programación 8/03/10 22
/**
* Constructor al que le pasamos el color y
* el numero de serie
*/
public Barco(int color, int numSerie) {
super(color, numSerie);
}
© M. Aldea y M. González
Prácticas de Programación 8/03/10 23
Resumen Herencia
3.2 Polimorfismo
La palabra polimorfismo viene de “múltiples formas”
Las operaciones polimórficas son aquellas que hacen funciones
similares con objetos diferentes
Ejemplo:
• suponer que existe la clase Figura y sus subclases
- Círculo Figura
- Cuadrado
+dibuja()
- Polígono +borra()
© M. Aldea y M. González
Prácticas de Programación 8/03/10 27
Tema 3. Herencia y Polimorfismo
3.2 Polimorfismo
Polimorfismo (cont.)
© M. Aldea y M. González
Prácticas de Programación 8/03/10 28
Polimorfismo en Java
El polimorfismo en Java consiste en dos propiedades:
1. Una referencia a una superclase puede apuntar a un objeto de
cualquiera de sus subclases
Vehículo v1=new Coche(Vehiculo.rojo,12345,2000);
Vehículo v2=new Barco(Vehiculo.azul,2345);
© M. Aldea y M. González
Prácticas de Programación 8/03/10 29
v.cilindrada(); // ¡ERROR!
c.cilindrada(); // correcto
© M. Aldea y M. González
Prácticas de Programación 8/03/10 32
© M. Aldea y M. González
Prácticas de Programación 8/03/10 33
Tema 3. Herencia y Polimorfismo
3.2 Polimorfismo
© M. Aldea y M. González
Prácticas de Programación 8/03/10 34
© M. Aldea y M. González
Prácticas de Programación 8/03/10 36
Tema 3. Herencia y Polimorfismo
3.2 Polimorfismo
Ejemplo: registro de vehículos (cont.)
© M. Aldea y M. González
Prácticas de Programación 8/03/10 37
} // clase RegistroDeVehículos
© M. Aldea y M. González
Prácticas de Programación 8/03/10 38
Resumen
El polimorfismo nos permite abstraer operaciones
• podemos invocarlas sin preocuparnos de las diferencias
existentes para objetos diferentes
• el sistema elige la operación apropiada al objeto
El polimorfismo se asocia a las jerarquías de clases:
• una superclase y todas las subclases derivadas de ella directa
o indirectamente
© M. Aldea y M. González
Prácticas de Programación 8/03/10 40
equals
En Java todas las clases descienden toString
de la clase Object ...
...
String Vehículo ... Figura ...
© M. Aldea y M. González
Prácticas de Programación 8/03/10 41
Método equals
Se encuentra definido en la clase Object como:
public class Object {
...
public boolean equals(Object obj) {
return this == obj;
}
...
}
• es decir, compara referencias, no contenidos
© M. Aldea y M. González
Prácticas de Programación 8/03/10 42
Tema 3. Herencia y Polimorfismo
3.3 La clase Object
Método equals (cont.)
}
© M. Aldea y M. González
Prácticas de Programación 8/03/10 43
Método toString
Se encuentra definido en la clase Object como:
public class Object {
...
public String toString() {
return ...;
}
...
}
• es utilizado por el sistema cuando se concatena un objeto con
un string, por ejemplo:
println("Valor coordenada:" + c);
• por defecto retorna un string con el nombre de la clase y la
dirección de memoria que ocupa el objeto
Coordenada@a34f5bd
© M. Aldea y M. González
Prácticas de Programación 8/03/10 45
Tema 3. Herencia y Polimorfismo
3.3 La clase Object
Método toString (cont.)
© M. Aldea y M. González
Prácticas de Programación 8/03/10 46
Ejemplos:
• nunca crearemos objetos de la clase Figura
- lo haremos de sus subclases Círculo, Cuadrado, ...
• nunca crearemos un Vehículo
- crearemos un Coche, un Barco, un Avión, ...
La razón es que no existen “figuras” o “vehículos” genéricos
• ambos conceptos son abstracciones de los objetos reales,
tales como círculos, cuadrados, coches o aviones
• a ese tipo de clases las denominaremos clases abstractas
© M. Aldea y M. González
Prácticas de Programación 8/03/10 47
© M. Aldea y M. González
Prácticas de Programación 8/03/10 48
Tema 3. Herencia y Polimorfismo
3.4 Clases abstractas
Métodos abstractos
Una clase abstracta puede tener métodos abstractos
• se trata de métodos sin cuerpo
• que es obligatorio redefinir en las subclases no abstractas
• ejemplo de método abstracto
public abstract int métodoAbstracto(double d);
no tiene cuerpo
© M. Aldea y M. González
Prácticas de Programación 8/03/10 49
+cambiaColor
+borra
+dibuja
Figura1D Figura2D
-ptoIni -colorRelleno
-ptoFin
+cambiaRelleno
/** Constructor */
public Figura1D(int color){
super(color);
}
© M. Aldea y M. González
Prácticas de Programación 8/03/10 52
/** Constructor */
public Figura2D(int color, int colorRelleno) {
super(color);
this.colorRelleno=colorRelleno;
}
3.5 Bibliografía
© M. Aldea y M. González
Prácticas de Programación 8/03/10 56