Académique Documents
Professionnel Documents
Culture Documents
- Herencia y polimorfismo
1. Herencia
1.1. Introduccin 1.2. Los constructores en la herencia 1.3. Modificadores de acceso 1.4. La clase Object 1.5 Herencia vs. composicin
1.1.- Introduccin
La herencia permite definir clases (subclases) a partir de otra clase ms genrica (superclase). La subclase rene todas la propiedades de la superclase, adems de las suyas propias. La herencia potencia la reutilizacin de cdigo, genera cdigo ms fiable y robusto y reduce el coste de mantenimiento.
Persona nombre apellidos dni mostrarNombre mostrarDNI Estudiante Estudiante numExpediente mostrarNumExp
class Estudiante extends Persona { . . .
Persona
class Persona(){ String nombre, apellidos, dni; void mostrarNombre(){ System.out.println(Nombre: + apellidos + , + nombre); } void mostrarDNI() { System.out.println(DNI: + dni); } } class Estudiante extends Persona { String numExpediente; void mostrarNumExp(){ System.out.println(Nm. Exp. + numExpediente); } } class Ejemplo { public static void main(String args[]) { Estudiante e = new Estudiante(); e.nombre = Ana; e.apellidos = Garca; e.dni = 1234567; e.numExpediente = 10001; e.mostrarNombre(); e.mostrarNumExp(); } }
1.1.- Introduccin
En Java no se permite la herencia mltiple. A B A
C Error
C Correcto
Una subclase hereda todos los mtodos y atributos de la superclase EXCEPTO: Atributos y mtodos privados Constructores (no se heredan pero s se ejecutan)
5
class Esfera(){ double radio; Esfera(double r) { radio = r; } } Esfera e1 = new Esfera(); Esfera e2 = new Esfera(10); Incorrecto. No existe constructor sin parmetros Correcto
6
Si utilizamos super, sta debe de ser la primera instruccin del constructor. De este modo se respeta el orden de ejecucin de los constructores.
10
11
Solucin a
Solucin b (preferible)
12
Misma clase Otra clase del mismo paquete Subclase de diferente paquete No subclase de diferente paquete
Si No No No
Si Si Si No
Si Si Si Si
14
15
Una figura no es un punto. Una Figura tiene un punto de origen. Un crculo es una figura. Un crculo no tiene una figura.
16
2. Polimorfismo
2.1. Introduccin 2.2. Sobreescritura de mtodos 2.3. La conversin hacia arriba 2.4. Enlace dinmico y polimorfismo 2.5. Clases abstractas 2.6. La conversin hacia abajo 2.7. Sobreescribir mtodos de Object
17
2.1- Introduccin
El polimorfismo es la capacidad que tienen los LOO de ofrecer distintas implementaciones para un mismo mtodo: Polimorfismo mltiples formas Una llamada a un mismo mtodo puede tener comportamientos distintos. Enlace esttico o temprano (polimorfismo en tiempo de compilacin)
Sobrecarga de mtodos Complejo c1, c2, c3; . . . c3 = c1.multiplica(c2); c3 = c1.multiplica(4);
19
20
21
Si se declara una clase como final, se impide que se extienda. final class Math { . . .
22
Sin embargo es posible declarar una referencia de tipo A y emplearla para instanciar un objeto de tipo B, siempre y cuando B sea una subclase (o un subtipo) de A.
A ref = new B();
Se denomina: Tipo esttico: el tipo con el que se declara la referencia. Tipo dinmico: el tipo del objeto instanciado. En la sentencia: A ref = new B(); Tipo esttico de ref: A Tipo dinmico de ref: B
23
Planeta
Limitaciones: slo se tiene acceso a los miembros definidos en el tipo esttico. En el ejemplo anterior, aunque se ha creado un objeto de tipo Planeta, mediante e slo se tiene acceso a los atributos y mtodos de Esfera.
24
obj1
B A
m1() m2()
obj1.m1() OK obj1.m2() OK
obj2
B A
m1() m2()
obj2.m1() OK obj2.m2() ERROR
obj3
A
m1()
ERROR
25
El tipo esttico determina QU se puede hacer. El tipo dinmico determina CMO se hace.
for(int i=0; i<10; i++) { if( el_usuario_realiza_cierta_accion ) v[i] = new Rectangulo(10,10); // Conv. hacia arriba else v[i] = new Circulo(5); // Conv. hacia arriba }
// Mostramos las reas de las figuras creadas
// Enlace dinmico
28
Requerimientos:
El objeto que le pasemos como parmetro al mtodo seleccionDirecta debe ser un subtipo (subclase) de Conjunto. La clase Conjunto debe contener los mtodos getNumElementos, menor e intercambiar. El objeto que pasemos como parmetro puede tener sobreescritos los 30 mtodos de la clase Conjunto.
El mtodo area es abstracto. Se incluye la cabecera del mtodo (tipo, nombre y parmetros) pero no la implementacin (el cdigo). Como la clase Figura tiene un mtodo abstracto, tambin debe ser abstracta. Las subclases de Figura debern implementar el mtodo area.
34
35
36
Qu ocurre si quiero hacer una operacin propia del tipo concreto con el que estoy trabajando?
f.setRadio(5);
// Error
Conversin hacia abajo: cambio del tipo de la referencia a un subtipo (a un tipo que jerrquicamente est por abajo).
Figura f = new Circulo(...); . . . Circulo c; c = (Circulo)f; c.setRadio(5);
// Conversin hacia arriba
O simplemente:
((Circulo)f).setRadio(5);
37
38
Si no est sobreescrito, se invova toString de Object. No esperemos que Object sepa cmo mostrar un Complejo.
40
3. Interfaces
3.1. Introduccin 3.2. Declaracin e implementacin de interfaces 3.3. Polimorfismo mediante interfaces 3.4. Definicin de constantes 3.5. Herencia entre interfaces
42
3.1- Introduccin
En Java no existe la herencia mltiple. Las interfaces ofrecen algunas de las ventajas de la herencia mltiple sin ninguno de sus inconvenientes. Una interfaz guarda muchas similitudes con una clase abstracta con todos sus mtodos abstractos y atributos constantes y estticos (final static).
A B No genera conflictos si todos los mtodos de A y B son abstractos. C
43
Ejemplo:
interface Coleccion { void aadirElemento( Object o ); int getNumElementos(); void mostrar(); }
44
I1
A
I2
B
F
46
47
Aunque no se especifique explcitamente, los atributos de una interfaz siempre son estticos y constantes (static final).
48
49