2/7/12
Repaso
! Herencia
! Superclase/subclase
! super
! Modificador protected
! Redefinicion de métodos
! Modificador final
(asociado a herencia)
! Clase Object
Programación orientada a
objetos
Curso INEM. Programación en Java
Santiago Muelas Pascual
[email protected]
Polimorfismo
Ejemplo
! Consiste en la posibilidad de que una referencia a un objeto
pueda conectarse también con objetos descendientes de este
! Puede tratarse cualquier subclase de animal como si fuese un
objeto de la clase Animal
! En otras palabras “Me da igual el tipo de subclase que seas
siempre que cumplas con la declaración de Animal”
! Tiene sentido por la existencia de la herencia
class Animal {
void mover() { …
}
}
class Perro extends Animal {}
class Pez extends Animal {}
public static void main(String[] args) {
Animal a = new Perro();
a = new Pez();
a.mover();
}
Polimorfismo
Ejercicio
! Sirve para generalizar, olvidándose de los detalles y
buscando puntos comunes
! Se usa, sobre todo, en la construcción de estructuras de datos
! Escenario:
! Necesitamos mantener un array de perros y gatos de una clínica
veterinaria
! ¿Cómo definimos dicho array? ¿Usamos uno o dos?
! También se puede realizar de manera implícita en el paso de
argumentos
! public void metodoquesea (Mamifero m)
! Crear un array de la clase Animal de tamaño 2
! Añadir a la primera posición un objeto de la clase Rana
! Añadir a la segunda posición un objeto de la clase Pez
! Recorrer el array llamando al método mover de cada objeto
1
Polimorfismo
Polimorfismo
! Nos permite crear sistemas que sean fácilmente extensibles
sin apenas tener que modificarlos
! Nuevas subclases pueden ser añadidas sin apenas tener que
modificar el código existente
! ¡OJO! No podemos tratar a un objeto de una superclase
como si fuese de una subclase
! Ej: Animal a;
! a puede ser un objeto de la clase Perro, Pez, … pero no sabemos
cuál.
! ¿Qué hacemos para convertir una referencia de una
superclase a una subclase?
! Casting Ej Perro p = (Perro) a;
! ¿Y si nos confundimos?
! Ej
! Perro p = new Perro();
!
String s = (String) p;
! ¿Qué hacemos para detectar si el casting es el adecuado?
Operador instanceof
Clases Abstractas
! Para comprobar si una referencia es una instancia (clase o
subclase) de la clase indicada
Animal h = new Animal();
if (h instanceof Animal) System.out.println(“Es un animal”);
Caballo h = new Caballo();
if (h instanceof Animal) System.out.println(“Es un animal”);
! Es una clase tan genérica, que nunca se creará una instanciación en
objetos
! Se produce un error de compilación si se intenta crear un objeto
! Sirve sólo como superclase, y, por tanto, para definir subclases
! Cuando uno de los métodos no tiene implementación, estamos ante
una clase abstracta
! El método sin implementación será un método abstracto
public abstract class Figura {
public abstract double area();
}
Ejemplo abstract
Ejercicio
! Una figura con el método área es una clase abstracta típica
¿Por qué?
! No se puede calcular el área de una figura
! Es necesario saber qué figura es la subclase (círculo,
cuadrado, …)
! Y redefinir el método para calcular el área dependiendo de la
figura correcta
! Modificar la clase Animal del ejercicio anterior para que el
método mover sea abstracto
2/7/12
2
Herencia múltiple
Interfaces
! Ya hemos dicho que no existe herencia múltiple entre clases
! ¿Por qué?
! ¿Y si necesitamos tener herencia múltiple?
! Similares a las clases abstractas
! En donde todos los métodos son abstractos
! Define el comportamiento pero no la implementación
! El qué pero no el cómo
! Las clases pueden implementar una interfaz
! Pero tienen que dar una definición de todos sus métodos
! O ser clases abstractas
! Ya que no estamos dando una implementación de todos sus
métodos
Ejemplo
Interfaces
public interface Figura {
double area();
}
public class Circulo implements Figura {
double area() {
…
}
}
public static void main(String[] args) {
Figura f = new Circulo(); // Similar a una clase abstracta
}
! No contienen a variables de instancia
! Sólo se pueden declarar constantes de tipo public
! public static final
! Y tienen que inicializarse
! Si no se especifica public static final, el compilador lo añade
automáticamente
! Los métodos tienen visibilidad public
! Aunque no se especifique
Ejercicio
Ejemplo
! Escribir la interfaz Animal que contenga al método mover
! Escribir las clases Pez y Caballo que implementen el método
mover mostrando un mensaje de texto por la salida. E.g.
“nadando”/”corriendo”
! Crear un array de objetos que cumplen la interfaz Animal y
añadir dos objetos de la clase Pez y Caballo
! Recorrer el array llamando al método mover.
public interface Figura {
double PI = 3.14;
double area();
}
public class Circulo implements Figura {
double area() {
…
}
}
public static void main(String[] args) {
Figura f = new Circulo(); // Similar a una clase abstracta
}
2/7/12
3
2/7/12
Ejemplo
Herencia de interfaces
public interface Figura {
double PI = 3.14;
double area();
}
public abstract class Circulo implements Figura {
}
public static void main(String[] args) {
Figura f = new Circulo(); //Error
}
! Una interfaz puede extender a otro al igual que sucedía con las clases
public interface ObjetoGrafico {
public void pintar();
}
public interface FiguraGrafica extends ObjetoGrafico {
public void area();
}
public class CuadradoGrafico implements FiguraGrafica {
public void area() { … }
public void pintar() { …}
}
Herencia múltiple
Herencia múltiple
! Ya hemos dicho que no existe herencia múltiple entre clases
! Una clase puede implementar más de una interfaz
interface Volador {
interface Corredor{
void volar();
void correr();
}
}
class Pegaso implements Volador, Corredor {
public void volar() {…}
public void correr() {…}
}
Herencia múltiple
Clase Object
interface Volador {
interface Corredor{
class Animal{
void volar();
void correr();
void comer();
}
}
}
class Pegaso extends Animal implements Volador, Corredor {
public void volar() {…}
public void correr() {…}
public void comer() {…}
}
! 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
! Los veremos más adelante
4
Método toString
Método equals
! 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
String toString() {…}
! == devuelve verdadero si las variables contienen la misma
referencia
! El método equals se utiliza para comparar el contenido
! Por defecto, devuelve la comparación ==
! La mayoría de las clases de biblioteca tienen redefinido el
método equals
Método equals
Método clone
public boolean equals(Object o) {
return (o instanceof MiClase &&
((MiClase) o).getMiAtributo == this.miAtributo);
}
! Para realizar una copia del objeto desde donde se llama
! Para implementarlo hay que implementar la interfaz
Clonable
! Por defecto, se copian el valor directo de las variables
! ¿Qué pasa con las referencias?
! Si no se implementa la interfaz, se genera una excepción
(error en ejecución como se verá más adelante)
Ejemplo
class Perro implements Cloneable{
String nombre;
public Perro(String nombre) {
this.nombre = nombre;
}
public Object clone() {
Perro p = new Perro(this.nombre);
return p;
}
public static void main(String[] args) {
Perro p = new Perro(“Pancho”);
Perro q = (Perro) p.clone();
}
}
2/7/12
5
Comentarios de: Curso de Programación en Java - Programación orientada a objetos (0)
No hay comentarios