2/5/12 Repaso Programación orientada a objetos Curso INEM. Programación en Java Santiago Muelas Pascual smuelas@fi.upm.es Herencia ! Cohesión ! Métodos get/set ! Acoplamiento ! Métodos estáticos o de clase ! Visibilidad/Control de acceso ! Modificador final ! Public ! Private ! Package ! Paquetes Superclase/Subclase ! La experiencia en el desarrollo de SW ha demostrado que una parte significativa de código trata con temas que están muy relacionados. ! Cuando se crea una clase, en vez de crear todos los miembros (atributos + métodos), se puede designar que la nueva clase herede los miembros de una clase existente ! La herencia es un mecanismo que sirve para reutilizar clases ! La clase existente se corresponde con la superclase ! Se utiliza cuando existen clases que comparten muchas de sus características ! La nueva con la subclase ! Se extiende la funcionalidad de clases más genéricas Ejemplo ! La clase Vehículo es la superclase de las subclases Motocicleta y Automóvil ! Tanto las clases motocicleta y automóvil comparten a la superclase Vehículo ! Pero no todos los objetos de la clase vehículo se comportan como los de la clase Automóvil o Motocicleta ! Una superclase puede tener cualquier número de subclases ! Aunque una subclase sólo puede tener asociada a una superclase ! Cada subclase puede convertirse en superclase de futuras subclases Superclase/Subclase ! Una subclase normalmente añade sus propios atributos o variables de instancia y métodos ! Es más específica que la superclase ! Representa a un grupo más especializado de objetos ! La subclase debe comportarse al menos como su superclase y además puede exhibir nuevos comportamientos ! No debería romper el comportamiento esperado de la superclase ! No hay herencia múltiple!!! 1 2/5/12 Sintáxis super ! Sirve para acceder a miembros de la superclase desde la subclase class Subclase extends Superclase { } Ej: class Perro extends Mamifero { super.metodoquesea(parámetros) } super.atributo super super ! También sirve para llamar al constructor desde el constructor de la subclase ! Si no añade la llamada desde una subclase, el compilador siempre añade una llamada super() por defecto ! super(parámetros) : llamada al constructor de la superclase ! Si el constructor de la superclase recibe parámetros, super tiene que llamarse con el tipo de parámetros adecuado class Motocicleta extends Vehiculo{ Motocicleta() { super(); } } ¿Es correcto? class Vehículo { int matricula; class Motocicleta extends Vehiculo { ¿Es correcto? class Vehículo { } Vehículo(int matricula) { Motocicleta() { Vehículo(int matricula) { this.matricula = matricula; this.matricula = matricula; } } class Motocicleta extends Vehiculo { int matricula; } } } } 2 2/5/12 Ejercicio ! Declare una clase Mamífero que tenga como atributos el nombre y el número de patas así como un constructor que reciba un nombre y un número de patas e inicialice los atributos o variables de instancia correspondientes. ! Cree la clase Perro como subclase de Mamífero. La clase Perro contendrá a un atributo raza (tipo String) y un constructor que reciba el nombre y la raza y establezca los valores adecuados en los atributos. Visibilidad/Control de acceso ! Puede (y suele) haber distintos niveles de visibilidad para los miembros (atributos y métodos) de una clase. ! Existen cuatro tipos de modificadores: ! public: se puede acceder desde cualquier lugar ! ! private: sólo se puede acceder desde la propia clase protected: sólo se puede acceder desde la propia clase o desde una clase que herede de ella ! Por defecto (package): Se puede acceder desde las clases pertenecientes al mismo paquete ! Se verá más adelante ¿Es correcto? class Vehículo { class Motocicleta extends Vehiculo { private int matricula; Motocicleta(int matricula) { Vehículo(int matricula) { super(matricula); this.matricula = matricula; super.matricula = 34; } } } } Ejemplo ! ¿Se mueve igual un pez, un pájaro o una rana? ! En cambio, todos son animales y podrían heredar el método mover de dicha clase ! Gracias a la redefinición cada objeto concreto realizará la operación mover como corresponda Redefinición de métodos ! Se puede modificar localmente el comportamiento de los métodos heredados ! Para ello con redeclarar un método declarado en la clase padre, se podría cambiar el comportamiento ! De esta manera objetos de distintos subclases pueden responder de forma diferente a la misma llamada ! Permite programar de manera más general Ejercicio ! Declarar la clase Animal que contenga un atributo nombre y el método mover. Este método deberá escribir por pantalla “moviéndome”. ! Declarar la clase Rana y redeclarar el método mover. El método deberá imprimir “saltando”. ! Repetir la operación con la clase Pajaro. El método deberá imprimir “volando”. ! Crear un objeto de la clase Rana, otro de la clase Pájaro y otro de la clase Animal. Llamar al método mover de cada uno de ellos. 3 2/5/12 Redefinición vs Sobrecarga Otros aspectos ¿Cuál es la salida? public class Animal { public void comer() { System.out.println(“comiendo genérico”); Animal a = new Animal(); a.comer(); } } public class Caballo extends animal { Caballo h = new Caballo(); h.comer(); public void comer() { ! Los métodos estáticos no puede ser redefinidos ! Van ligados a la clase ! No podemos redefinir un método con una visibilidad más restrictiva class Padre{ public void met() {…} System.out.println(“caballo comiendo heno”); h.comer(“Manzanas”); } Class Hija extends Padre { public void comer(String s) { System.out.println(“Caballo comiendo “ + s); Animal a2 = new Animal(); A2.comer(“Zanahorias”); } } } Otros aspectos ! @Override ! Para indicar al compilador que estamos redefiniendo un método de una clase padre. private void met() {…} } Herencia y final ! En caso de no querer la redefinición de métodos o incluso la creación de subclases (herencia) : ! Y así pueda comprobar que coincide el nombre y los parámetros public final void mover() class Padre{ void metodo(int a){} } class Hija extends Padre{ @Override void metodo(String a){} } public final class Animal {…} // Sin Override el compilador piensa que estamos sobrecargando Clase Object Método toString ! Realmente todas las clases que creemos son subclases… ! Devuelve un representación en un String de un objeto ! … de la clase Object ! Por defecto devuelve el nombre del paquete, el de la clase y una representación hexadecimal correspondiente al valor devuelto por el método hashCode ! Esta clase tiene métodos habituales que están disponibles para cualquier clase que creemos ! Los más habituales son: ! equals ! toString ! System.out.println(miobjeto) llama a toString del objeto miobjeto String toString() {…} ! clone ! hashCode 4