El documento explica los conceptos de clases abstractas e interfaces en Java. Las clases abstractas pueden contener métodos abstractos cuya implementación debe proveerse por las subclases, mientras que las interfaces definen métodos pero no su implementación, la cual queda a cargo de las clases que las implementen. El documento incluye ejemplos de declaración e implementación de clases abstractas y de interfaces.
2. Clases Abstractas
Un método abstracto es un método declarado en una
clase para el cual esa clase no proporciona la
implementación (el código).
Una clase abstracta es una clase que tiene al menos
un método abstracto.
Una clase que extiende a una clase abstracta debe
implementar los métodos abstractos (escribir el
código) o bien volverlos a declarar como abstractos,
con lo que ella misma se convierte también en clase
abstracta.
3. Presentan un nivel de "abstracción" tan elevado que no
sirven para instanciar objetos de ellas.
Representan los escalones más elevados de algunas
jerarquías de clases y solo sirven para derivar otras clases,
en las que se van implementando detalles y concreciones,
hasta que finalmente presentan un nivel de definición
suficiente que permita instanciar objetos concretos.
Se suelen utilizar en aquellos casos en que se quiere que
una serie de clases mantengan una cierta característica o
interfaz común. Por esta razón a veces se dice de ellas que
son pura interfaz.
5. Declaración e implementación de
métodos abstractos
abstract class FiguraGeometrica {
. . .
abstract void dibujar();
. . .
}
class Circulo extends FiguraGeometrica {
. . .
void dibujar() {
// codigo para dibujar Circulo
. . .
}
}
6. Declaración de clases abstractas
Las clases abstractas se declaran empleando la palabra
reservada abstract como se muestra a continuación:
public abstract class IdClase . . .
Ejemplo:
/**
* Declaracion de la clase abstracta FiguraGeometrica
* A. Garcia-Beltran - noviembre, 2005
*/
public abstract class FiguraGeometrica {
// Declaracion de atributos
private String nombre;
// Declaracion de metodos
abstract public double area();
public figuraGeometrica (String nombreFigura ) {
nombre = nombreFigura;
}
final public boolean mayorQue (FiguraGeometrica otra) {
return area()>otra.area();
}
final public String toString() {
return nombre + " con area " + area();
}
}
7. Reglas de uso:
Una clase abstracta solo puede ser usada como clase
base para otras clases, pero no puede ser instanciada
para crear un objeto.
Una clase abstracta no puede ser utilizada como
argumento o como retorno de una función.
Si puede declararse punteros a clase abstracta .
Se permiten referencias a clase abstracta, suponiendo
que el objeto temporal no es necesario en la
inicialización.
8. Referencias y objetos abstractos
Se pueden crear referencias a clases abstractas como cualquier otra:
FiguraGeometrica figura;
Sin embargo una clase abstracta no se puede instanciar, es decir, no se
pueden crear objetos de una clase abstracta. El compilador producirá un
error si se intenta:
FiguraGeometrica figura = new FiguraGeometrica();
Esto es coherente dado que una clase abstracta no tiene completa su
implementación y encaja bien con la idea de que algo abstracto no
puede materializarse.
Sin embargo:
FiguraGeometrica figura = new Circulo(. . .);
figura.dibujar();
La invocación al método dibujarse resolverá en tiempo de ejecución y la
JVM llamará al método de la clase adecuada.
9. Ejemplo clase abstracta
public abstract class Figura {
int x, y;
public void mostrarOrigen() {
System.out.println("x= "+x+" y= "+y);}
public abstract double area(); // No tiene implementación
public abstract double mostrarNombre();
}
public class Triangulo extends Figura {
protected int base, altura;
public Triangulo (int ba, int al) { base=ba; altura=al; }
public double area() { return base*altura/2; }
public void mostrarNombre() { System.out.println(“triangulo”); }
}
public class Cuadrado extends Figura {
protected int lado;
public Cuadrado (int lado) { this.lado=lado; }
public double area() { return lado*lado; }
public void mostrarNombre() { System.out.println(“cuadrado”);}}
10. Prueba clase abstracta
public class PruebaClaseAbstracta {
public static void main(String args[]) {
Figura fig;
Triangulo tri;
Cuadrado cua;
fig = new Figura(); // error no se puede
//instanciar una clase abstracta
tri = new Triangulo(4,3);
tri.mostrarOrigen();
tri.mostrarNombre();
fig = tri;
fig.mostrarNombre();
System.out.println("Area triangulo: "+fig.area());
cua = new Cuadrado(5);
fig = cua;
System.out.println("Area cuadrado: "+fig.area());
}
}
11. Interfaces
Una interfaz en java es un conjunto de métodos
abstractos y propiedades. En ellas se especifica qué
se debe hacer pero no su implementación. Serán las
clases que implementen estas interfaces las que
describan la lógica del comportamiento de los
métodos.
12. Ventajas al utilizar interfaces
Se organiza la programación.
Obligar a que ciertas clases utilicen los mismos
métodos (nombres y parámetros).
Establecer relaciones entre clases que no estén
relacionadas.
13. Declaración de interfaces
interface NombreInterfaz {
tipo static final NOMBRECONSTANTE1 = valor;
…….….….
public tipoDevuelto nombreMetodo1(listaParámetros);
…….….….
}
class NombreClase implements NombreInterfaz1
[, NombreInterfaz2 ..] {
// declaración atributos y métodos de la clase
…….….….
}
15. Extensión de interfaces
Se puede definir un interface que especialice a otro
interface mediante extends similar a herencia.
Un interface puede extender a varios interfaces a la vez.
interface ElementoOrdenado extends
Comparable, Cloneable, java.io.Serializable {
// miembros y métodos propios del interfaz
//ElementoOrdenado
.....
}
16.
Ejemplo:
public interface Nombrable {
static final boolean CIERTO = true;
public void mostrarNombre();
}
public class Elemento implements Nombrable {
String nombre;
public Elemento(String nom) {
nombre = nom; }
// obligatorio implementar método mostrarNombre
public void mostrarNombre(){
System.out.println("Nombre: "+nombre);
if (CIERTO)
System.out.println("Constante CIERTO ");
}}