Programación orientada a objetos ! - Laboratorio SS.OO....

4
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

Transcript of Programación orientada a objetos ! - Laboratorio SS.OO....

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