Professional Documents
Culture Documents
Tema 1. Introduccin al anlisis y diseo de programas Tema 2. Clases y objetos Tema 3. Herencia y Polimorfismo Tema 4. Tratamiento de errores Tema 5. Aspectos avanzados de los tipos de datos Tema 6. Modularidad y abstraccin: aspectos avanzados Tema 7. Entrada/salida con ficheros Tema 8. Verificacin y prueba de programas
Prcticas de Programacin
Prcticas de Programacin
3.1 Herencia
Relacin de herencia: todos los coches son vehculos
Vehculo
Coche
La herencia es un mecanismo por el que se pueden crear nuevas clases a partir de otras existentes, heredando, y posiblemente modificando, y/o aadiendo operaciones heredando y posiblemente aadiendo atributos Observar que una operacin o atributo no puede ser suprimido en el mecanismo de herencia Nomenclatura clase original clase extendida
Prcticas de Programacin
superclase subclase
padre hijo
M. Aldea y M. Gonzlez 8/03/10
Vehculo Coche
3
Herencia de operaciones
Al extender una clase se heredan todas las operaciones del padre se puede aadir nuevas operaciones La nueva clase puede elegir para las operaciones heredadas: redefinir la operacin: se vuelve a escribir - la nueva operacin puede usar la del padre y hacer ms cosas: programacin incremental - o puede ser totalmente diferente dejarla como est: no hacer nada La herencia se puede aplicar mltiples veces da lugar a una jerarqua de clases
Prcticas de Programacin
Los atributos y mtodos de la superclase no se repiten en las subclases - salvo que se hayan redefinido
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
Ejemplo
Clase que representa un vehculo cualquiera
Vehculo
-color: int -numSerie: int +color(): int +numSerie(): int +pinta(nuevoColor: int) +cambiaNumSerie(nuevo: int)
Prcticas de Programacin
Prcticas de Programacin
/** * Obtener el numero de serie */ public int numSerie() { return numSerie; } /** * Obtener el color */ public int color() { return color; }
Prcticas de Programacin
/** * Cambiar el numero de serie */ public void cambiaNumSerie(int numSerie) { this.numSerie=numSerie; } /** * Pintar el vehculo de un color */ public void pinta(int nuevoColor) { color = nuevoColor; } }
M. Aldea y M. Gonzlez 8/03/10
Prcticas de Programacin
Coche
Prcticas de Programacin
10
Tema 3. Herencia y Polimorfismo 3.1 Herencia Ejemplo: extensin a la clase Coche (cont.)
public class Coche extends Vehculo { // cilindrada del coche private int cilindrada; /** Obtiene la cilindrada del coche */ public int cilindrada(){ return cilindrada; } /** Cambia la cilindrada del coche */ public void cambiaCilindrada(int nuevaCilin) { this.cilindrada=nuevaCilin; } }
Prcticas de Programacin
11
Prcticas de Programacin
12
Coche
-cilindrada: int
Barco
Prcticas de Programacin
13
:Barco color: int numSerie: int color(): int numSerie(): int pinta(nuevoColor: int) cambiaNumSerie(nuevo: int)
heredados aadidos
Prcticas de Programacin
14
Redefiniendo operaciones
Una subclase puede redefinir (override) una operacin en lugar de heredarla directamente En muchas ocasiones (no siempre) la operacin redefinida invoca la de la superclase se usa para ello la palabra super se refiere a la superclase del objeto actual Invocacin del constructor de la superclase: super(parmetros...); Invocacin de un mtodo de la superclase: super.nombreMtodo(parametros...);
Prcticas de Programacin
15
Herencia y Constructores
Los constructores no se heredan las subclases deben definir su propio constructor Normalmente ser necesario inicializar los atributos de la superclase para ello se llama a su constructor desde el de la subclase /** constructor de una subclase */ public Subclase(parmetros...) { // invoca el constructor de la superclase super(parmetros para la superclase); // inicializa sus atributos ... } la llamada a super debe ser la primera instruccin del constructor de la subclase
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
16
Si desde un constructor de una subclase no se llama expresamente al de la superclase el compilador aade la llamada al constructor sin parmetros public Subclase(int i){ this.i=i; }
se convierte en
public Subclase(int i){ super(); this.i=i; } en el caso de que la superclase no tenga un constructor sin parmetros se producira un error de compilacin
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
17
18
19
{...}
/** * Obtener un texto con los datos * del vehculo */ public String toString() { return "Vehculo -> numSerie= "+ numSerie+", color= "+nombre[color]; } }
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
20
Prcticas de Programacin
21
/** Obtiene la cilindrada del coche */ public int cilindrada() { return cilindrada; } /** Cambia la cilindrada del coche */ public void cambiaCilindrada(int nueva) { cilindrada = nueva; } /** Retorna un texto con los datos del coche */ @Override public String toString() { return super.toString()+ ", cilindrada= " + cilindrada; } }
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
22
Prcticas de Programacin
23
24
Uso recomendado del modificador de acceso protected regla general: todos los campos de una clase son privados se proporcionan mtodos pblicos para leer y/o cambiar los campos (pero slo cuando sea necesario) en el caso de que se desee que un campo slo pueda ser ledo y/o cambiado por las subclases se hacen mtodos protected public class Superclase { private int atributo; // atributo privado // mtodo para leer (pblico) public int atributo() { return atributo; } // mtodo para cambiar (slo para las subclases) protected void cambiaAtributo(int a) { atributo = a; }
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
25
Resumen Herencia
Las clases se pueden extender la subclase hereda los atributos y mtodos de la superclase Al extender una clase se pueden redefinir sus operaciones si se desea, se puede invocar desde la nueva operacin a la de la superclase: programacin incremental A la subclase se le pueden aadir nuevas operaciones y atributos
26
3.2 Polimorfismo
La palabra polimorfismo viene de mltiples formas Las operaciones polimrficas son aquellas que hacen funciones similares con objetos diferentes Ejemplo: suponer que existe la clase Figura y sus subclases - Crculo Figura - Cuadrado +dibuja() - Polgono +borra() Todas ellas con las operaciones: - dibuja - borra
Prcticas de Programacin
27
Nos gustara poder hacer la operacin polimrfica mueveFigura que opere correctamente con cualquier clase de figura: mueveFigura borra dibuja en la nueva posicin
Esta operacin polimrfica debera: llamar a la operacin borra del Crculo cuando la figura sea un crculo llamar a la operacin borra del Cuadrado cuando la figura sea un cuadrado etc.
Prcticas de Programacin
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 Vehculo v1=new Coche(Vehiculo.rojo,12345,2000); Vehculo v2=new Barco(Vehiculo.azul,2345); 2. La operacin se selecciona en base a la clase del objeto, no a la de la referencia v1.toString() usa el mtodo de la clase Coche, puesto que v1 es un coche v2.toString()
usa el mtodo de la clase Barco, puesto que v2 es un barco
Prcticas de Programacin
29
Gracias a esas dos propiedades, el mtodo moverFigura sera: public void mueveFigura(Figura f, Posicin pos){ f.borra(); f.dibuja(pos); } Y podra invocarse de la forma siguiente: Crculo c = new Crculo(...); Polgono p = new Polgono(...); mueveFigura(c, pos); mueveFigura(p, pos); Gracias a la primera propiedad el parmetro f puede referirse a cualquier subclase de Figura Gracias a la segunda propiedad en mueveFigura se llama a las operaciones borra y dibuja apropiadas
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
30
El lenguaje permite que una referencia a una superclase pueda apuntar a un objeto de cualquiera de sus subclases pero no al revs Vehculo v = new Coche(...); // permitido Coche c = new Vehculo(...); // NO permitido! Justificacin: un coche es un vehculo - cualquier operacin de la clase Vehculo existe (sobrescrita o no) en la clase Coche v.cualquierOperacin(...); // siempre correcto un vehculo no es un coche - sera un error tratar de invocar la operacin: c.cilindrada(); // ERROR: cilindrada() no // existe para un vehculo - por esa razn el lenguaje lo prohbe
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
31
El casting cambia el punto de vista con el que vemos al objeto a travs de v le vemos como un Vehculo (y por tanto slo podemos invocar mtodos de esa clase) a travs de c le vemos como un Coche (y podemos invocar cualquiera de los mtodos de esa clase)
Prcticas de Programacin
32
Hacer una conversin de tipos incorrecta produce una excepcin ClassCastException en tiempo de ejecucin Vehculo v=new Vehculo(...); Coche c=(Coche)v;
lanza ClassCastException en tiempo de ejecucin
Java proporciona el operador instanceof que permite conocer la clase de un objeto if (v instanceof Coche) { Coche c=(Coche)v; NUNCA lanza ClassCastException (por que es ... seguro que v es un coche) } v instanceof Coche retorna true si v apunta a un objeto de la clase Coche o de cualquiera de sus (posibles) subclases
M. Aldea y M. Gonzlez 8/03/10
Prcticas de Programacin
33
Prcticas de Programacin
34
35
/** elimina del registro el vehculo con el * nmero de serie indicado * Retorna false si no le encuentra */ public boolean eliminaVehculo(int numSerie) { for(int i=0; i<numVehculos; i++) if (numSerie==vRegistrados[i].numSerie()) { // Encontrado. Se elimina desplazando los // siguientes "hacia la izquierda" for(int j=i; j<numVehculos-1; j++) vRegistrados[j]=vRegistrados[j+1]; numVehculos--; return true; } // fin if // si llega aqu es porque no le ha encontrado return false; }
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
36
/** retorna el vehculo que ocupa la posicin * "pos" del registro */ public Vehculo vehculoEnPos(int pos) { if (pos<0 || pos>=numVehculos) return null; // posicin invlida // posicin vlida, retorna el vehculo return vRegistrados[pos]; } /** pinta todos los vehculos */ public void pintaTodos(int color) { for(int i=0; i<numVehculos; i++) vRegistrados[i].pinta(color); }
Prcticas de Programacin
37
/** retorna string con todos los vehculos */ public String toString() { String txt=""; for(int i=0; i<numVehculos; i++) txt = txt + vRegistrados[i].toString() + " return txt; } } // clase RegistroDeVehculos
";
Prcticas de Programacin
38
Ejemplo de utilizacin de la clase RegistroDeVehculos: RegistroDeVehculos registro = new RegistroDeVehculos(5); Barco b = new Barco(Vehculo.verde, 1274); registro.registraVehculo(b); registro.registraVehculo(new Coche(Vehculo.azul, 3021, 2000)); registro.registraVehculo(new Barco(Vehculo.rojo, 4765)); registro.pintaTodos(Vehculo.verde); System.out.println(registro.todosATexto()); Vehculo v = registro.vehculoEnPos(1);
Si creamos la clase Avin que extiende a Vehculo la clase RegistroDeVehculos no necesita ser modificada
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
39
Resumen
El polimorfismo nos permite abstraer operaciones podemos invocarlas sin preocuparnos de las diferencias existentes para objetos diferentes el sistema elige la operacin apropiada al objeto El polimorfismo se asocia a las jerarquas de clases: una superclase y todas las subclases derivadas de ella directa o indirectamente El polimorfismo en Java consiste en dos propiedades: 1. Una referencia a una superclase puede apuntar a un objeto de cualquiera de sus subclases 2. La operacin se selecciona en base a la clase del objeto, no a la de la referencia
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
40
Coche
Barco
Crculo
Cuadrado
Es como si el compilador aadiera extends Object a todas las clases de primer nivel public class Clase {...}
es transformado por el compilador en
41
Mtodo 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
Como cualquier otro mtodo de una superclase se puede redefinir en sus subclases
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
42
Con lo que sabemos ahora ya podemos entender la redefinicin del mtodo equals para la clase Coordenada (vista en el tema 2): public class Coordenada { private int x; // coordenada en el eje x private int y; // coordenada en el eje y ...
aconsejable cuando se redefine un mtodo para detectar errores
@Override public boolean equals(Object obj) { Coordenada c = (Coordenada) obj; return c.x == x && c.y == y; } }
Prcticas de Programacin
43
Para ser ms correctos, la redefinicin del mtodo debera ser: public boolean equals(Object obj) { if (!(obj instanceof Coordenada)) Si obj no es de la clase return false; Coordenada retorna Coordenada c = (Coordenada) obj; false directamente y evita la excepcin return c.x == x && c.y == y; ClassCastException } Muchas clases estndar Java utilizan el mtodo equals de la clase Object para comparar objetos por esa razn es importante que nuestras clases redefinan este mtodo en lugar de definir uno similar public boolean equals(Coordenada obj){ NO redefine ... el mtodo } equals de la
clase Object
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
44
Mtodo 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 direccin de memoria que ocupa el objeto Coordenada@a34f5bd
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
45
Una redefinicin til del mtodo toString para la clase Coordenada podra ser: @Override public String toString() { return "(" + x + "," + y + ")"; } Con esta redefinicin el segmento de cdigo Coordenada c = new Coordenada(1,2); System.out.println("Coord: " + c); producira la salida: Coord:(1,2)
Prcticas de Programacin
46
47
Pero NO es un error utilizar referencias a clases abstractas que pueden apuntar a objetos de cualquiera de sus subclases (como ocurra con las referencias a superclases no abstractas) Figura f1 = new Crculo(...); // correcto Figura f2 = new Cuadrado(...); // correcto
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
48
Mtodos abstractos
Una clase abstracta puede tener mtodos abstractos se trata de mtodos sin cuerpo que es obligatorio redefinir en las subclases no abstractas ejemplo de mtodo abstracto public abstract int mtodoAbstracto(double d);
no tiene cuerpo
Prcticas de Programacin
49
Prcticas de Programacin
Tema 3. Herencia y Polimorfismo 3.4 Clases abstractas Ejemplo: clase abstracta Figura y subclases (cont.)
public abstract class Figura { // color del borde de la figura private int color; /** Constructor */ public Figura(int color) { this.color=color; } /** cambia el color del borde de la figura */ public void cambiaColor(int color) { this.color=color; } /** borra la figura (abstracto) */ public abstract void borra(); /** dibuja la figura (abstracto) */ public abstract void dibuja(); }
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
51
Tema 3. Herencia y Polimorfismo 3.4 Clases abstractas Ejemplo: clase abstracta Figura y subclases (cont.)
public abstract class Figura1D extends Figura { /** Constructor */ public Figura1D(int color){ super(color); } // NO redefine ningn mtodo abstracto }
Prcticas de Programacin
52
Tema 3. Herencia y Polimorfismo 3.4 Clases abstractas Ejemplo: clase abstracta Figura y subclases (cont.)
public abstract class Figura2D extends Figura { // color de relleno de la figura private int colorRelleno; /** Constructor */ public Figura2D(int color, int colorRelleno) { super(color); this.colorRelleno=colorRelleno; } /** cambia el color de relleno */ public void cambiaRelleno(int color) { colorRelleno=color; } // NO redefine ningn mtodo abstracto }
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
53
Tema 3. Herencia y Polimorfismo 3.4 Clases abstractas Ejemplo: clase abstracta Figura y subclases (cont.)
public class Recta extends Figura1D { private final double x0,y0,x1,y1; /** Constructor */ public Recta(int color, double x0, double y0, double x1, double y1) { super(color); this.x0=x0; this.y0=y0; this.x1=x1; this.y1=y1; } /** implementa el mtodo abstracto borra */ @Override public void borra() { implementacin...; } /** implementa el mtodo abstracto dibuja */ @Override public void dibuja() { implementacin...; } ...; } }
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
54
Tema 3. Herencia y Polimorfismo 3.4 Clases abstractas Ejemplo: clase abstracta Figura y subclases (cont.)
public class Crculo extends Figura2D { private double xCentro, yCentro, radio; /** Constructor */ public Crculo(int color, int colorRelleno, double xCentro,double yCentro,double radio){ super(color, colorRelleno); this.xCentro=xCentro; this.yCentro=yCentro; this.radio=radio; } /** implementa el mtodo abstracto borra */ @Override public void borra() { implementacin...; } /** implementa el mtodo abstracto dibuja */ @Override public void dibuja() { implementacin...; } }
Prcticas de Programacin M. Aldea y M. Gonzlez 8/03/10
55
3.5 Bibliografa
King, Kim N. Java programming: from the beginning. W. W. Norton & Company, cop. 2000 Francisco Gutirrez, Francisco Durn, Ernesto Pimentel. Programacin Orientada a Objetos con Java. Paraninfo, 2007. Ken Arnold, James Gosling, David Holmes, El lenguaje de programacin Java, 3 edicin. Addison-Wesley, 2000. Eitel, Harvey M. y Deitel, Paul J., Cmo programar en Java, quinta edicin. Pearson Educacin, Mxico, 2004.
Prcticas de Programacin
56