Download - Programación orientada a objetos ! - Laboratorio SS.OO. …laurel.datsi.fi.upm.es/_media/docencia/cursos/java/2012… ·  · 2012-10-082/5/12% 1 Programación orientada a objetos

Transcript

2/5/12  

1  

Programación orientada a objetos

Curso INEM. Programación en Java Santiago Muelas Pascual

[email protected]

Repaso

! Cohesión

! Acoplamiento

! Visibilidad/Control de acceso !   Public

!   Private

!   Package

! Métodos get/set

! Métodos estáticos o de clase

! Modificador final

! Paquetes

Herencia

!   La experiencia en el desarrollo de SW ha demostrado que una parte significativa de código trata con temas que están muy relacionados.

!   La herencia es un mecanismo que sirve para reutilizar clases

!   Se utiliza cuando existen clases que comparten muchas de sus características

!   Se extiende la funcionalidad de clases más genéricas

Superclase/Subclase

!   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 clase existente se corresponde con la superclase

!   La nueva con la subclase

!   Cada subclase puede convertirse en superclase de futuras subclases

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

!   No hay herencia múltiple!!!

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

2/5/12  

2  

Sintáxis

class Subclase extends Superclase {

}

Ej:

class Perro extends Mamifero {

}

super

! Sirve para acceder a miembros de la superclase desde la subclase

super.metodoquesea(parámetros)

super.atributo

super

! También sirve para llamar al constructor desde el constructor de la subclase

!   super(parámetros) : llamada al constructor de la superclase

class Motocicleta extends Vehiculo{

Motocicleta() {

super();

}

}

super

!   Si no añade la llamada desde una subclase, el compilador siempre añade una llamada super() por defecto

!   Si el constructor de la superclase recibe parámetros, super tiene que llamarse con el tipo de parámetros adecuado

¿Es correcto?

class Vehículo {

int matricula;

Vehículo(int matricula) {

this.matricula = matricula;

}

}

class Motocicleta extends Vehiculo {

}

¿Es correcto?

class Vehículo {

int matricula;

Vehículo(int matricula) {

this.matricula = matricula;

}

}

class Motocicleta extends Vehiculo {

Motocicleta() {

}

}

2/5/12  

3  

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 {

private int matricula;

Vehículo(int matricula) {

this.matricula = matricula;

}

}

class Motocicleta extends Vehiculo {

Motocicleta(int matricula) {

super(matricula);

super.matricula = 34;

}

}

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

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

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.

2/5/12  

4  

Redefinición vs Sobrecarga public class Animal {

public void comer() {

System.out.println(“comiendo genérico”);

}

}

public class Caballo extends animal {

public void comer() {

System.out.println(“caballo comiendo heno”);

}

public void comer(String s) {

System.out.println(“Caballo comiendo “ + s);

}

}

¿Cuál es la salida?

Animal a = new Animal();

a.comer();

Caballo h = new Caballo();

h.comer();

h.comer(“Manzanas”);

Animal a2 = new Animal();

A2.comer(“Zanahorias”);

Otros aspectos

!   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() {…}

}

Class Hija extends Padre {

private void met() {…}

}

Otros aspectos

!   @Override !   Para indicar al compilador que estamos redefiniendo un método

de una clase padre. !   Y así pueda comprobar que coincide el nombre y los parámetros

class Padre{ void metodo(int a){} }

class Hija extends Padre{ @Override void metodo(String a){} } // Sin Override el compilador piensa que estamos sobrecargando

Herencia y final

!   En caso de no querer la redefinición de métodos o incluso la creación de subclases (herencia) :

public final void mover()

public final class Animal {…}

Clase Object

! Realmente todas las clases que creemos son subclases…

!   … de la clase Object

! Esta clase tiene métodos habituales que están disponibles para cualquier clase que creemos

!   Los más habituales son: !   equals

! toString

!   clone

! hashCode

Método toString

!   Devuelve un representación en un String de un objeto

!   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

! System.out.println(miobjeto) llama a toString del objeto miobjeto

String toString() {…}