Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Herencia y Polimorfismo
Esquema
2.1. Introduccin
2.2. Herencia
2.2.1. Concepto de herencia
2.2.2. Enmascaramiento de variables y sobrescritura de
mtodos
2.2.3. Jerarquas de clases
2.2.4. Organizacin de jerarquas de clases (paquetes)
2.2.5. Polimorfismo
2.3. Mecanismos adicionales de abstraccin basados en
herencia
2.3.1. Clases y mtodos abstractos
2.3.2. Interfaces
2.4. Genricos
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
2.1. Introduccin
Las tres caractersticas fundamentales que definen la
programacin orientada a objetos son: encapsulacin,
herencia y polimorfismo.
Encapsulando aumentbamos la cohesin y disminuamos el
acoplamiento en los programas, lo que se traduce en una
mayor reutilizabilidad y fiabilidad del software, mayor facilidad
de desarrollo, de pruebas y de mantenimiento (aumento de la
calidad del software).
Otra caracterstica bsica de la orientacin a objetos es la
herencia. La herencia es un
mecanismo de abstraccin
consistente en la capacidad de derivar nuevas clases a partir
de otras ya existentes.
Otra caracterstica clave de la orientacin a objetos es el
polimorfismo. El polimorfismo permite que diferentes objetos
puedan responder al mismo mensaje en diferentes formas
(Arnow y Weiss, 1998). Usando polimorfismo podemos tratar
de forma unificada diferentes clases relacionadas por herencia.
Como veremos, el polimorfismo involucra la denominada
sobrescritura de mtodos y la utilizacin de referencias.
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Sintaxis bsica:
class clase_hija extends clase_padre {
--- contenido de la clase --}
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Clase Padre_2
Clase Hija
Herencia mltiple
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Clase Padre
Clase Hija
Herencia simple
9
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
10
Tesis
#departamento:String
+Tesis(titulo:String, autores:String, departamento:String, dia:int, mes:int, agno:int)
+devolver_departamento():String
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
11
Cdigo Java:
class Publicacion {
protected String titulo;
protected String autores;
protected int [ ] fecha_edicion=new int [3];
public Publicacion (String titulo, String autores, int dia,
int mes, int agno) {
this.titulo=titulo;
this.autores=autores;
fecha_edicion [0]=dia;
fecha_edicion [1]=mes;
fecha_edicion [2]=agno;
}
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
12
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
13
14
15
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
16
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
17
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
18
19
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
20
21
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
22
23
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Sobrescritura
del mtodo
heredado
24
Main:
class Herencia {
public static void main(String [ ] args) {
ClaseX x = new ClaseX( );
ClaseY y = new ClaseY( );
x.imprimir( );
y.imprimir( );
}
}
El resultado es:
En ClaseX, n= 25
En ClaseY, m= 10
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
25
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
26
?
Mtodo_B
(Clase hija)
27
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
28
Clase padre
Mtodo_B
(Clase padre)
Mtodo_A
Clase hija
Mtodo_B
(Clase hija)
29
Hijo 1
Nieto 1
Hijo 2
Nieto 2
Hijo 3
Nieto 3
Segundo nivel
jerrquico
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
30
Ejemplo:
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
31
es cerrado
y tiene
Polgono
lados rectos
y tiene
Tringulo
tres lados
y tiene
Tringulo_equilatero
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
33
Ejemplo:
class Alumno{
private String nombre;
private int matricula;
// Constructor
Alumno(String nombreAlumno, int matriculaAlumno){
nombre = nombreAlumno;
matricula = matriculaAlumno;
}
// Sobrescritura del mtodo toString
public String toString( ) {
return "Los datos del alumno son:" + nombre + " "
+ matricula;
}
}
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
34
Se puede
invocar el
toString()
usando slo
el
identificador
del objeto
35
36
Para poder trabajar con paquetes tenemos que hacer dos cosas:
a) Crearlos, indicando qu clases forman parte del mismo y
dnde se va a encontrar dicho paquete.
b) Usarlo, importando el paquete tal y como ya hemos visto en
programas anteriores.
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
37
Primera
sentencia del
fichero
38
b) Uso de paquetes
- Para usar un paquete hay que importarlo:
import nombre_paquete.nombre_clase;
import nombre_paquete.*;
- Tambin se puede usar sin importar, pero hay que indicar el
nombre del paquete precediendo a la clase de la forma siguiente:
nombre_paquete.nombre_clase
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
39
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
40
41
Vacaciones
Navidades
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
Verano
42
43
44
45
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
46
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
47
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
48
49
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
50
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
51
52
<<abstracta>>
Clase {abstracta}
Clase
Atributos
Atributos
Procedimientos
Procedimientos
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
53
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
54
Automvil
{abstracta}
Deportivo
Turismo
Familiar
55
56
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
57
58
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
59
60
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
61
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
62
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
63
En UML:
- los atributos y
mtodos estticos van
subrayados.
- los mtodos
abstractos se
representan en cursiva
Nombre_Clase
<<interface>>
Nombre
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
64
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
65
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
66
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
67
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
68
Desde Java 5 se cuenta con los tipos genricos, que permiten aplicar
abstraccin de tipos de datos de forma parecida (no igual) a los
templates o plantillas de C++. En Java, esto se aplica a los tipos
referencia (en la prctica a las clases, no a los tipos primitivos).
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
69
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
70
}
T representa el tipo genrico y se puede usar como un tipo normal.
Recordemos que T representa un tipo referencia, no un tipo primitivo.
Si se quieren usar tipos primitivos se debe hacer a travs de las clases
contenedoras de Java
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
71
Para usar una clase parametrizada basta con indicar el tipo concreto al
crear objetos:
Ejemplo<String> miEjemplo =
new Ejemplo<String>(No hay mal que por bien no venga);
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
72
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
73
Clase Ejemplo
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
74
75
76
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
77
2.4. Genricos(X)
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
78
2.4. Genricos(XI)
Restricciones:
o No se pueden crear objetos de clases genricas, slo referencias.
T objeto; //OK
objeto=new T (); //Mal
o No se pueden crear matrices de genricos, slo referencias
T matriz [ ]; //OK
matriz =new T [10]; //Mal
o No se pueden crear matrices de referencias genricas de un tipo
especfico
Nombre_clase <Integer> matriz []= new Nombre_clase<Integer>[10] //Mal
Nombre_clase <?> matriz []= new Nombre_clase<?>[10] //OK
? es un argumento wildcard (carcter comodn) que representa un
tipo desconocido.
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
79
2.4. Genricos(XII)
class Ejemplo_Metodo_Generico {
/*
* Mtodo genrico que imprime una matriz
* El mtodo imprime_matriz se podra sobrecargar
* (sera equivalente) pero ms tedioso
*
*/
public static <T> void imprime_matriz(T[] a) {
for ( int i=0; i<a.length;i++ ){
System.out.printf("%s ",a[i]); //a[i] equivale a
//a[i].toString()
}
System.out.println();
}
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
80
2.4. Genricos(XIII)
public static void main(String args[]){
/* Creacin de 4 matrices:
de enteros, de dobles, de caracteres y de Cuentas */
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
Cuenta [] c=new Cuenta [2];
c[0]=new Cuenta (1,1.0);
c[1]=new Cuenta (2,2.0);
System.out.println( "La matriz de enteros contiene:" );
imprime_matriz( intArray ); // Se pasa una matriz de enteros
System.out.println( "La matriz de dobles contiene:" );
imprime_matriz( doubleArray ); // Se pasa una matriz de dobles
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
81
2.4. Genricos(XIV)
System.out.println( "La matriz de caracteres contiene:" );
imprime_matriz( charArray ); // Se pasa una matriz de caracteres
System.out.println( "La matriz de Cuenta contiene:" );
imprime_matriz( c ); // Se pasa una matriz de caracteres
}
}
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
82
2.4. Genricos(XV)
class Cuenta{
protected int ncuenta;
protected double saldo;
public Cuenta (int ncuenta, double saldo){
this.ncuenta=ncuenta;
this.saldo=saldo;
}
public int getcuenta() {
return ncuenta;
}
public double getsaldo() {
return saldo;
}
public String toString() {
return "Numero de cuenta "+ncuenta+ " con saldo de "+ saldo+"\n";
}
}//fin clase Cuenta
Fundamentos de Programacin II
C.Muoz Caro & A. Nio-Universidad de Castilla-La Mancha
83