Clases Abstractas

Publicado el 26 mayo 2013 por Cristian David Henao Hoyos @chenaooo
En la entrada sobre conceptos básicos hablamos un poco sobre el termino de Abstracción y en general del como se aplica en el campo de la programación.
En esta ocasión vamos a trabajar un poco mas en detalle sobre este concepto de forma rápida y sencilla, veremos la importancia del mismo y su aplicación.
Como se ha mencionado, la abstracción permite resaltar lo mas representativo de algo sin importar los detalles.
Básicamente una clase Abstracta es similar a una clase normal (como la vimos en la entrada anterior), la estructura es practicamente igual, ya que poseen nombre, atributos y métodos pero para que una clase sea abstracta la condición es que almenos uno de sus métodos sea abstracto (se le agrega la palabra reservada abstract y no se especifica el cuerpo del método).................su uso depende de la aplicación del concepto de Herencia y adicionaremos a la estructura básica de clase la palabra reservada abstract
Veamos como se implementa en Java.
public abstract class Principal{
/**Método concreto con implementación*/
public void metodoConcreto(){
...............
...............
}
/**Método Abstracto sin implementación*/
public abstract void metodoAbstracto();

}
class subClase extends Principal{
@Override
public void metodoAbstracto() {
/**Implementación definida por la clase concreta*/
}
}

Caracteristicas de una Clase Abstracta.
Esto es lo que debemos conocer sobre de Clases Abstractas.
  • Una clase Abstracta No puede ser instanciada (no se pueden crear objetos directamente - new ), solo puede ser heredada. 
  • Si almenos un método de la clase es abstract, esto obliga a que la clase completa sea definida abstract, sin embargo la clase puede tener el resto de métodos no abstractos.
  • Los métodos abstract no llevan cuerpo (no llevan los caracteres {}). 
  • La primer subclase concreta que herede de una clase abstract debe implementar todos los métodos de la superclase.
¿Cuando Utilizarlas?.
Al trabajar clases y métodos abstractos, no solo mantenemos nuestra aplicación mas organizada y fácil de entender sino que también al no poder instanciar una clase abstracta nos aseguramos de que las propiedades especificas de esta, solo estén disponibles para sus clases hijas....
Con las Clases Abstractas lo que hacemos es definir un proceso general que luego sera implementado por las clases concretas que hereden dichas funcionalidades..........¿Que?........... es decir, si tengo una clase que hereda de otra Abstracta, estoy obligado a poner en el código, todos los métodos abstractos de la clase padre, pero esta vez serán métodos concretos y su funcionalidad o cuerpo sera definido dependiendo de para que la necesite, de esa manera si tengo otra clase que también hereda del mismo padre, implementaré el mismo método pero con un comportamiento distinto..........Veamos un Ejemplo.

En el diagrama vemos una clase Abstracta Instrumento, la cual posee una propiedad tipo y un método abstracto tocar(), vemos también las clases hijas Guitarra, Saxofon y Violin que para este ejemplo solo utilizaremos (mediante la herencia) las propiedades de la clase Padre.

Todos los instrumentos musicales se pueden tocar, por ello creamos este método abstracto, ya que es un proceso común en todos los instrumentos sin importar el detalle de como se tocan, pues sabemos que una guitarra no se toca de la misma manera que el saxofon, así al heredar de la clase Instrumento, todas sus clases hijas están obligadas a implementar este método y darle la funcionalidad que le corresponda...

veamos esto en Java.

/**
* Clase Abstracta Instrumento
*/
abstract class Instrumento{
public String tipo;
public abstract void tocar();
}
/**
* Clase Concreta Guitarra, hija de Instrumento
*/
class Guitarra extends Instrumento {
public Guitarra(){
tipo="Guitarra";
}
public void tocar() {
System.out.println("Tocar La Guitarra");
}
}
/**
* Clase Concreta Violin, hija de Instrumento
*/
class Violin extends Instrumento {
public Violin(){
tipo="Violin";
}
public void tocar() {
System.out.println("Tocar El violin");
}
}
/**
* Clase Concreta Saxofon, hija de Instrumento
*/
class Saxofon extends Instrumento {
public Saxofon(){
tipo="Saxofon";
}
public void tocar() {
System.out.println("Tocar el Saxofon");
}
}
public class Principal {
public static void main(String arg[]){
/**Objeto miGuitarra de tipo Instrumento */
Instrumento miGuitarra= new Guitarra();
System.out.println("Instrumento : "+miGuitarra.tipo);
miGuitarra.tocar();
System.out.println();
/**Objeto miSaxofon de tipo Instrumento */
Instrumento miSaxofon= new Saxofon();
System.out.println("Instrumento : "+miSaxofon.tipo);
miSaxofon.tocar();
System.out.println();
/**Objeto miViolin de tipo Instrumento */
Instrumento miViolin= new Violin();
System.out.println("Instrumento : "+miViolin.tipo);
miViolin.tocar();

}
}
Como vemos cada una de las clases concretas implementan el método tocar() y le dan la funcionalidad dependiendo de como se toque el instrumento, también en cada constructor de las clases definimos el tipo, pero si nos fijamos bien en las clases concretas no tenemos la variable tipo declarada, pues estamos usando la variable heredada de la clase Instrumento.

Hay que tener en cuenta que cuando trabajamos con clases Abstractas, estas solo pueden ser heredadas mas no instanciadas, esto quiere decir que no podemos crear objetos directamente de estas clases.


Como vemos en la clase Principal tenemos la lógica para ejecutar nuestra aplicación y usamos el concepto de Polimorfismo para crear los objetos de tipo Instrumento por medio de sus clases Hijas, pero en ningún momento creamos un objeto como instancia directa de la clase abstracta......
Y listo, ya aplicamos de manera simple el concepto de Abstracción, en la próxima entrada veremos que son las Interfaces y mas adelante veremos como funciona el Polimorfismo mediante otro ejemplo de programación........
Referencias.
Revista JavaWorld

SCJP Sun Certified Programmer for Java 6

También te podría Interesar. 

  • Clases en Java.
  • Herencia en Java.
  • Conceptos Básicos de Programación Orientada a Objetos.
  • ¿ String Vrs StringBuffer Vrs StringBuilder ?
  • Comparando Fechas En Java
  • Tutorial Aplicaciones Web con Jboss Seam
  • Instalación del servidor de aplicaciones JBoss
¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo....