Clases Abstractas e Interfaces
Presentación basada en:
1. Java 2., Curso de programación. Fco. Javier Ceballos. Ed. Alfoomega&RA-MA, 2003.
2. Apuntes del Curso Programación Orientado a Objetos. Pablo Castells. Escuela Politécnica Superior, Universidad Autonoma de Madrid.
3. Apuntes del Curso de java. Luis Hernández y Carlos Cervigón. Facultad de Informática. Universidad Católica de Madrid.
Clases Abstractas
Definición:Clases definidas en la jerarquía que simplemente recogen las características comunes de otra serie de clases ( sus
descendientes), pero que no se van a (o no se deben) utilizar para crear ejemplares.
Características de una Clase abstracta:
Modela el comportamiento común de sus clases derivadas.
Establece métodos que necesariamente han de ser implementados por sus
subclases (las clases derivadas)ÆMETODOS ABSTRACTOS.
Métodos sin código, se declaran pero no se definen
Deben definirse en alguna subclaseÆSi una subclase no implementa un método abstracto heredado debe ser abstractatambién
Un método abstracto debe pertenecer a una clase abstracta
Implementa métodosque son comunes a todas sus subclases (No
abstractos).
La clase abstracta puede definir atributos comunesa sus subclases.
En el sistema no se crean ejemplaresde la clase abstracta porque no serían objetos con existencia propia en el mundo real.
Clases Abstractas:Ejemplo
Clases Abstractas:
ObjetoGrafico y Paralelogramo
En el programa de dibujo sólo se van a crear
objetos gráficos concretos
de : puntos, elipses,
círculos, cuadrados, rectángulos, rombos o
romboides.
Clases Abstractas:Ejemplo(2)
Para definir una clase como abstracta se coloca la palabra reservada
abstractantes de class:
public abstract classObjetoGrafico {...
Si en la clase abstracta se quiere obligar a que las subclases implementen un determinado método, basta declararlo como método abstracto. No tendrá cuerpo y terminará en punto y coma:
public abstract classObjetoGrafico { // Abstracta public abstractString toString();
public abstract voiddesplaza();
public abstract booleanesCerrada();
public abstract doublearea(); }
Para definir un método como abstractose coloca la palabra reservada
abstractantes de este
Las subclases (no abstractas) no podrán compilarse si no implementan
métodos con esos prototipos.
Métodos Abstractos
Clases Abstractas:Ejemplo(3)
// Clase Punto: no abstracta
public classPunto extendsObjetoGrafico {
privatedouble x; privatedouble y; publicPunto() { x = 0; y = 0; }
publicPunto(doublecx, doublecy) { x = cx;
y = cy; }
public doubledameX() { returnx; }
public doubledameY() { returny; }
public voidponX(doubled) { x = d; }
public voidponY(doubled) { y = d; }
…..
Clases Abstractas:Ejemplo(4)
// Implementa todos los métodos abstractos: public voiddesplaza(doubledeltaX, doubledeltaY) {
x += deltaX; y += deltaY; }
publicString toString(){
return"(" + x + "," + y + ")"; }
public booleanesCerrada() { returnfalse; }
public doublearea(){return0;}
Clases Abstractas:Ejemplo(5)
// Paralelogramo: otra clase abstracta
public abstract class
Paralelogramo extends
ObjetoGrafico {
protected
Punto esquina;
public
Paralelogramo() { esquina = new
Punto(0, 0); }
public
Punto dameEsquina() { return
esquina; }
public void
ponEsquina(Punto p) { esquina = p; }
// Implementa uno de los métodos abstractos
public boolean
esCerrada() { return
true; }
// Todos los paralelogramos son cerrados.
}
Nota
: Los métodos abstractos toString(), desplaza() y
area()
no
presentan problemas por que Paralelogramo es una clase
abstracta.
Clases Abstractas:Ejemplo(6)
// Cuadrado: clase no abstracta
public classCuadrado extendsParalelogramo {
protected doublelado;
publicCuadrado() { super(); lado = 0; }
public doubledameLado() { return lado; }
public voidponLado(double d) { lado = d; }
// Implementa los otros dos métodos abstractos publicString toString() {
return"[" + esquina.toString() + ", " + lado + "]"; }
public voiddesplaza(doubledeltaX, doubledeltaY) { esquina.desplaza(deltaX, deltaY);
}
Utilidad de los métodos
abstractos
class
ObjetoCompuesto {
private
Vector objeto
s
Grafico
s
= new
Vector ();
void
agregarObjetos (
ObjetoGrafico
obj) {
objeto
s
Grafico
s
.addElement (obj);
}
double
area () {
double
a = 0;
Enumeration enum = objeto
s
Grafico
s
.elements ();
while (enum.hasMoreElements ())
a += ((
ObjetoGrafico
) enum.nextElement ()) .
area
();
return
a;
}
}
Clase Abstracta
La clase java.lang.Number
Es una clase abstracta
Byte Short Integer Long Float Double abstract Number shortValue() byteValue() métodos no abstractos longValue() intValue() floatValue() doubleValue() métodos abstractos
La clase java.lang.Object
Clase padre por defecto si no se especifica
otra
class
A {...} es equivalente a
class
A
extends
Object
{...}
Tratamiento genérico de objetos: vectores,
etc.
Proporciona definición por defecto para
métodos como: toString, finalize, getClass
Los
arrays
son también subclases de
Object
Meta-información de clases(1)
Se puede obtener Meta-información sobre las
clases en tiempo de ejecución
El operador
instanceof
Cuadrado c = new Cuadrado();
ObjetoGrafico obj1 = c;
c instanceof
Cuadrado
Æ
true
c instanceof
Paralelogramo
Æ
true
c instanceof
ObjetoGrafico
Æ
true
c instanceof
Circulo
Æ
false
obj1 instanceof
Cuadrado
Æ
true
Meta-información de clases(2)
ObjetoGrafico.javaC:\ObjetoGrafico.java:82: inconvertible types found : Cuadrado
required: Punto
if (c instanceof Punto) System.out.println ("c instancia de Punto"); ^ 1 error
Meta-información de clases(2)
Ejemplo
classA { voidf (Persona p) { if (p instanceofEmpleado)System.out.println ("Clase Empleado"); else if (p instanceofPersona)
System.out.println ("Clase Persona"); }
} // Bloque main
A a = new A ();
Directivo dir = new Directivo (...); Persona p = dir;
a.f (dir); a.f (p); Animal x = p;