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 abstracta también Un método abstracto debe pertenecer a una clase abstracta Implementa métodos que son comunes a todas sus subclases (No abstractos). La clase abstracta puede definir atributos comunes a sus subclases. En el sistema no se crean ejemplares de la clase abstracta porque no serían objetos con existencia propia en el mundo real. new A () ERROR si A abstracta Los objetos que se crearán serán ejemplares de las subclases (aquellas que no sean también abstractas). 1
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. Métodos Abstractos Clases Abstractas:Ejemplo(2) Para definir una clase como abstracta se coloca la palabra reservada abstract antes de class: public abstract class ObjetoGrafico {... 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 class ObjetoGrafico { // Abstracta public abstract String tostring(); public abstract void desplaza(); public abstract boolean escerrada(); public abstract double area(); Para definir un método como abstracto se coloca la palabra reservada abstract antes de este Las subclases (no abstractas) no podrán compilarse si no implementan métodos con esos prototipos. 2
Clases Abstractas:Ejemplo(3) // Clase Punto: no abstracta public class Punto extends ObjetoGrafico { private double x; private double y; public Punto() { x = 0; y = 0; public Punto(double cx, double cy) { x = cx; y = cy; public double damex() { return x; public double damey() { return y; public void ponx(double d) { x = d; public void pony(double d) { y = d;.. Clases Abstractas:Ejemplo(4) // Implementa todos los métodos abstractos: public void desplaza(double deltax, double deltay) { x += deltax; y += deltay; public String tostring(){ return "(" + x + "," + y + ")"; public boolean escerrada() { return false; public double area(){return 0; 3
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 class Cuadrado extends Paralelogramo { protected double lado; public Cuadrado() { super(); lado = 0; public double damelado() { return lado; public void ponlado(double d) { lado = d; // Implementa los otros dos métodos abstractos public String tostring() { return "[" + esquina.tostring() + ", " + lado + "]"; public void desplaza(double deltax, double deltay) { esquina.desplaza(deltax, deltay); public double area(){return lado*lado; 4
Utilidad de los métodos abstractos class ObjetoCompuesto { private Vector objetosgraficos = new Vector (); void agregarobjetos (ObjetoGrafico obj) { objetosgraficos.addelement (obj); Clase Abstracta double area () { double a = 0; Enumeration enum = objetosgraficos.elements (); while (enum.hasmoreelements ()) a += ((ObjetoGrafico) enum.nextelement ()).area (); return a; La clase java.lang.number Es una clase abstracta métodos shortvalue() no abstractos bytevalue() abstract Number longvalue() intvalue() floatvalue() doublevalue() métodos abstractos Byte Double Short Float Integer Long 5
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 6
Meta-información de clases(2) ObjetoGrafico.java C:\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 class A { void f (Persona p) { if (p instanceof Empleado) System.out.println ("Clase Empleado"); else if (p instanceof Persona) 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; a.f (x); // ERROR 7