TutorJava Nivel Básico

Algunas veces, una clase que se ha definido representa un concepto abstracto y como tal, no debe ser ejemplarizado. Por ejemplo, la comida en la vida real. �Has visto alg�n ejemplar de comida? No. Lo que has visto son ejemplares de manzanas, pan, y chocolate. Comida representa un concepto abstracto de cosas que son comestibles. No tiene sentido que exista un ejemplar de comida.

Similarmente en la programaci�n orientada a objetos, se podr�an modelar conceptos abstractos pero no querer que se creen ejemplares de ellos. Por ejemplo, la clase Number del paquete java.lang representa el concepto abstracto de n�mero. Tiene sentido modelar n�meros en un programa, pero no tiene sentido crear un objeto gen�rico de n�meros. En su lugar, la clase Number s�lo tiene sentido como superclase de otras clases como Integer y Float que implementan n�meros de tipos espec�ficos. Las clases como Number, que implementan conceptos abstractos y no deben ser ejemplarizadas, son llamadas clases abstractas. Una clase abstracta es una clase que s�lo puede tener subclases--no puede ser ejemplarizada.

Para declarar que una clase es un clase abstracta, se utiliza la palabra clave abstract en la declaraci�n de la clase.

abstract class Number {
    . . .
}

Si se intenta ejemplarizar una clase abstracta, el compilador mostrar� un error similar a este y no compilar� el programa.

AbstractTest.java:6: class AbstractTest is an abstract class. It can't be instantiated.
        new AbstractTest();
        ^
1 error

.�M�todos Abstractos

Una clase abstracta puede contener m�todos abstractos, esto es, m�todos que no tienen implementaci�n. De esta forma, una clase abstracta puede definir un interface de programaci�n completo, incluso porporciona a sus subclases la declaraci�n de todos los m�todos necesarios para implementar el interface de programaci�n. Sin embargo, las clases abstractas pueden dejar algunos detalles o toda la implementaci�n de aquellos m�todos a sus subclases.

Veamos un ejemplo de cuando ser�a necesario crear una clase abstracta con m�todos abstractos. En una aplicaci�n de dibujo orientada a objetos, se pueden dibujar c�rculos, rect�ngulos, l�neas, etc.. Cada uno de esos objetos gr�ficos comparten ciertos estados (posici�n, caja de dibujo) y comportamiento (movimiento, redimensionado, dibujo). Podemos aprovecharnos de esas similitudes y declararlos todos a partir de un mismo objeto padre-ObjetoGrafico.

Sin embargo, los objetos gr�ficos tambi�n tienen diferencias subtanciales: dibujar un c�rculo es bastante diferente a dibujar un rect�ngulo. Los objetos gr�ficos no pueden compartir estos tipos de estados o comportamientos. Por otro lado, todos los ObjetosGraficos deben saber como dibujarse a s� mismos; se diferencian en c�mo se dibujan unos y otros. Esta es la situaci�n perfecta para una clase abstracta.

Primero se debe declarar una clase abstracta, ObjetoGrafico, para proporcionar las variables miembro y los m�todos que van a ser compartidos por todas las subclases, como la posici�n actual y el m�todo moverA().

Tambi�n se deber�an declarar m�todos abstractos como dibujar(), que necesita ser implementado por todas las subclases, pero de manera completamente diferente (no tiene sentido crear una implementaci�n por defecto en la superclase). La clase ObjetoGrafico se parecer�a a esto.

abstract class ObjetoGrafico {
    int x, y;
    . . .
    void moverA(int nuevaX, int nuevaY) {
        . . .
    }
    abstract void dibujar();
}

Todas las subclases no abstractas de ObjetoGrafico como son Circulo o Rectangulo deber�n proprocionar una implementaci�n para el m�todo dibujar().

class Circulo extends ObjetoGrafico {
    void dibujar() {
        . . .
    }
}
class Rectangulo extends ObjetoGrafico {
    void dibujar() {
        . . .
    }
}

Una clase abstracta no necesita contener un m�todo abstracto. Pero todas las clases que contengan un m�todo abstracto o no proporcionen implementaci�n para cualquier m�todo abstracto declarado en sus superclases debe ser declarada como una clase abstracta.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP