Programación Orientada a Objetos III

Anuncio
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 
Descargar