En PC Resumen explicaremos que es una clase abstracta en el lenguaje de programación en Java. Se dan situaciones en las que se quiere definir una superclase que declare la estructura de una determinada abstracción sin implementar completamente cada método. Es decir, a veces se quiere crear una superclase que únicamente defina una forma generalizada que se compartirá con todas las subclases, dejando que cada subclase complete los detalles necesarios. Una clase de este tipo determina la naturaleza de los métodos que las subclases deben implementar. Un caso en el que puede darse esta situación es aquel en que una superclase no es capaz de crear una implementación de un método que tenga un significado completo. Esto es lo que pasaba con el programa anterior.
Como iréis viendo cuando hizo sus propias bibliotecas de clases, es bastante común que un método no tenga una definición completa en el contexto de la superclase. Esta situación puede tratarse de dos formas. Una opción, como hemos hecho antes es mostrar un mensaje de aviso. Esto puede ser útil alguna vez sobre todo a la hora de depurar, pero normalmente no resulta adecuado. Se pueden definir métodos que hayan de ser sobreescritos por la subclase para tener un significado completo. En este caso, tenemos que asegurarnos de que una subclase sobrescriba perfectamente todos los métodos necesarios. La solución que ofrece Java es el método abstracto.
Puede ser necesario que las subclases sobrescriban ciertos métodos especificando el modificador de tipo abstract.
Para declarar un método como abstracto sólo hay que poner la palabra clave abstract antes de la declaración del método.
Cualquier clase que contenga un método abstracto o más debe declararse como abstracta. Para declarar una clase abstracto, simplemente tenemos que utilizar la palabra clave abstract delante de la palabra clave class al principio de la declaración de la clase. No puede haber objetos de una clase abstracto, es decir no se pueden crear instancias de estas clases a través del operador new. Tampoco se pueden declarar constructores abstractos, o métodos estáticos abstractos. Cualquier subclase de una clase abstracta debe implementar todos los métodos abstractos de la superclase, o declararse también como abstracta.
Aunque no se pueden crear instancias de las clases abstractas, sí que se pueden utilizar para crear referencias a objetos, ya que el polimorfismo de Java durante el tiempo de ejecución se implementa mediante la referencia a las superclases. Además, se puede crear una referencia a una clase abstracta de forma que pueda utilizarse como referencia a un objeto dentro de una subclase. Lo veremos en el siguiente ejemplo. Como hemos visto que el concepto de área no tiene ningún significado en una figura indefinida, la siguiente versión del programa declara el método area como abstracto dentro de Figura. Esto implica que todas las subclases están obligadas a implementarlo.
abstract class Figura {
double dim1;
double dim2;
Figura(double a, double b) {
dim1 = a;
dim2 = b;
}
abstract double area();
}
}
class Rectángulo extends Figura {
Rectángulo(double a, double b) {
super(a, b);
}
double area() {
System.out.println("dentro Area de Rectángulo.");
return dim1 * dim2;
}
}
class Triángulo extends Figura {
Triángulo(double a, double b) {
super(a, b);
}
double area () {
System.out.println("dentro Area de Triángulo.");
return dim1 * dim2 / 2;
}
}
class AbstractaArees {
public static void main(String args[]) {
Rectángulo r = new Rectángulo(9, 5);
Triángulo t = new Triángulo(10, 8);
Figura figref; // Esto es correcto. No estamos creando ningún objeto
figref = r;
System.out.println("Area es" + figref.area ());
figref = t;
System.out.println ("Area es" + figref.area ());
}
}
Aunque no es posible crear un objeto del tipo Figura, podemos crear una variable de referencia de su tipo. La variable figref se declara como referencia a Figura y esto significa que puede utilizarse para referirse a un objeto de cualquier clase derivado Figura. Los métodos sobreescritos se resuelven mediante variables de referencia de la superclase en tiempo de ejecución.