2/5/12
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
Programación orientada a
objetos
Curso INEM. Programación en Java
Santiago Muelas Pascual
[email protected]
Herencia
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.
! 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
! 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
Superclase/Subclase
! 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!!!
! 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
1
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
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{
! 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
Motocicleta() {
super();
}
}
¿Es correcto?
¿Es correcto?
class Vehículo {
int matricula;
Vehículo(int matricula) {
this.matricula = matricula;
}
}
class Motocicleta extends Vehiculo {
}
class Vehículo {
int matricula;
class Motocicleta extends Vehiculo {
Motocicleta() {
Vehículo(int matricula) {
}
this.matricula = matricula;
}
}
}
2/5/12
2
Ejercicio
Visibilidad/Control de acceso
! 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.
! 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?
Redefinición de métodos
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;
}
}
}
}
! 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
Ejercicio
! ¿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
! 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
3
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
Herencia y final
! @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
! 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
Método toString
! 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
! 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() {…}
2/5/12
4
Comentarios de: Curso de Programación en Java - Programación orientada a objetos (0)
No hay comentarios