Programación orientada a objetos ! - Laboratorio SS.OO....
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
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() {…}