Sunteți pe pagina 1din 14

Abstracción en Java

Msc. Lesbia Valerio Lacayo


Concepto de Abstracción

Podríamos definir la abstracción como la "acción de aislar mentalmente o considerar por separado las cualidades
de un objeto, considerar un objeto en su esencia". ¿Qué quiere decir esta definición? A través de la abstracción
conseguimos extraer las cualidades principales sin detenernos en los detalles. Conseguimos a partir de un tema
determinado, generalizar y obtener una visión global del tema. Cuando montamos un ordenador ensamblamos los
componentes necesarios para construir el ordenador. Utilizamos una placa base, un disco duro, memoria, etc.
Manejamos estos dispositivos a un nivel funcional. Es decir, abstraemos las funciones de cada dispositivo para
trabajar con ellos. En ningún momento nos paramos a pensar cómo funcionan internamente o de cuántos
condensadores y transistores está compuesto.

La abstracción es una herramienta muy potente en programación, pues reduce considerablemente el trabajo de
implementación y aumenta la portabilidad del código. La programación orientada a objetos aporta elementos para
abstraer el problema en dos sentidos:

Por un lado nos permite referirnos a objetos para representar la realidad,describiendo el problema en términos
del problema en lugar de en términos de la solución. En un programa de gestión comercial, tendremos el objeto
cliente o el objeto factura, que no son más que representaciones de otros objetos en el espacio del problema.

de objetos y agruparlos en una clase. Gracias a este nivel de abstracción, añadir o eliminar un objeto nuevo
supondrá muy poco esfuerzo.

La abstracción describe el proceso mediante el cual se da forma a una entidad de la realidad tangible para
ponerla en un código que maneje pautas basadas en estas características junto con funciones que representen
este tipo de clases, la abstracción en concreto es representada dentro del lenguaje de programación Java por
medio de atributos, métodos y clases, a través de los cuales se va a dar forma a un código determinado.

El modelado de códigos orientados a objetos establece notables características para que a fin de cuentas se haga
un código final que logre abstraer un objeto correctamente y eso debe hacerse al ponerlo en perspectiva, es
decir teniendo una visión externa del objeto donde se estudia su comportamiento desde fuera para luego poder
aplicarlo en un código que lo modele en un objeto.
Características de la abstracción

Llevar a cabo una idea abstracta con el fin de que sea aplicada en un código determinado es importante en el
mundo de la Programación Orientada a Objetos, entender estas ideas o pensamientos para que luego sean
concretadas en algo material, que va a ejercer una función específica y se puede tocar, es la base de todo el
asunto de abstracción en Java, esta puede tener distintas caras, porque depende de quién aborda el proyecto
y como lo aborda es que se crea un espécimen tangible, la abstracción va ligada a la herencia de forma especial
porque juntas van a crear las conexiones necesarias para que se pueda implementar el código, destacando los
atributos, las características, la forma, el espacio, las acciones que se van a realizar.

En Java se puede realizar la abstracción de entidades para representar un modelo de forma útil sobre un ente
determinado, las acciones que a su vez desempeñan otras acciones son posibles bajo este concepto y son
conocidas como abstracción de acciones, se puede realizar la agrupación de operaciones en máquinas virtuales
que van a ser utilizadas en un nivel superior para controlar operaciones, cuando se almacenan un conjunto de
operaciones que no se relacionan entre sí se da el caso de la abstracción de conciencia y establece una forma
bastante particular a la hora de programar objetos, por lo que se puede decir que Java reconoce notables
fuentes de inspiración para lograr códigos funcionales y útiles.

Clases abstractas

Sirven para modelar objetos de alto nivel, no contienen código, sino solo declaraciones.
Todos sus métodos deben existir en sus clases hijas.
Una clase abstracta no puede ser instanciada (Crear un objeto a partir de ella).
Métodos abstractos

Los métodos abstractos se utilizan en clases abstractas para imponer una cierta funcionalidad a las subclases de
las clases abstractas. Los métodos abstractos se designan por la palabra reservada abstract y no tienen cuerpo.
La implementación de los métodos abstractos se deja a las subclases.

Ejemplo:

clase figura se definen los métodos abstractos calcularArea( ) y perimetro( ) que devuelven el área y el
perímetro del objeto figura. Las subclases Circulo y Rectangulo se pueden definir como subclases de Figura. Ya
que el área de un rectángulo y de un círculo se calcula utilizando fórmulas matemáticas diferentes, las clases
Rectángulo y Circulo proporcionarán sus propias implementaciones de los métodos calcularArea( ) y perimetro( ).

Estos métodos son parte de clases abstractas


Un método abstracto debe ser redefinido en las subclases.
Cada subclase puede definir el método de manera diferente.
Las clases abstractas pueden contener métodos que no son abstractos.

Por omisión, los métodos en Java tienen ligadura estática; si la palabra reservada abstract precede a la
declaración de un método, este método se denomina abstracto, y le indica al compilador que será definido
(implementando su cuerpo) en una clase derivada (no necesariamente en la derivada inmediata). Se debe calificar
un método miembro de una clase con la palabra reservada abstract sólo cuando exista una posibilidad de que
otras clases puedan ser derivadas de aquella.

Un uso común de los métodos abstractos es la declaración de clases abstractas y la implementación del
polimorfismo Consideremos la clase Figura como la clase base de la que se derivan otras clases, tales como
Rectángulo, Circulo y Triangulo. Cada figura debe tener la posibilidad de calcular su área y poder dibujarla. En
este caso, la clase Figura declara los métodos calcularArea( ) y dibujar( ) abstractos.
classFigura
{
publicabstractdoublecalcularArea( );
publicabstractvoid dibujar( );
// otros métodos miembro que definen un interfaz a todos los
// tipos de figuras geométricas.
}

Los métodos abstractos de la clase Figura serán definidos en la clase derivadas, por ello aparece el punto y coma(
; ) a continuación del nombre y lista de argumentos del método. La clase Figura es una clase abstracta, toda clase
con uno o más métodos abstractos es una clase abstracta y en Java hay que declararla abstracta con la palabra
reservada abstract. Así la declaración correcta de Figura :

abstractclass Figura
{
//…………….
}

Cada clase derivada específica debe definir sus propias versiones concretas de los métodos que han sido
declarados abstractos en la clase base. Por consiguiente, si se derivan las clases Circulo y Rectangulo de la clase
Figura, se deben definir los métodos miembros calcularArea( ) y dibujar( ) en cada clase. Por ejemplo, las
definiciones de la clase Circulo pueden ser similares a éstas:

classCirculo extends Figura


{
public double calcularArea( )
{
return (PI * radio * radio);
}
public void dibujar( )
{
// ……………..
}
private double xc, yc;
private double radio;
}
En el caso de que una clase derivada no redefina su propia versión de un método abstracto declarado en la clase
base, se convierte también en clase abstracta, ya que hereda el método abstracto.

Clases abstractas

Las clases abstractas suelen representar conceptos generales, las características comunes de una serie de
objetos. Así, persona es una clase abstracta en un contexto de trabajadores de una empresa. De igual forma,
Figura es una clase abstracta, siendo Rectángulo, Circulo…clases concretas. De una clase abstracta no se obtienen
elementos activos, no tiene objetos; sin embargo, se puede instanciar el objeto Círculo de radio 5.0 y centro (1,1).
En Java, el modificador abstract declara a una clase abstracta:

Abstract class nombreclase {// …….}

por ejemplo:

public abstract class Persona


{
private String apellido,
//
public void identificacion (String a, String c) { …………}
………
}

Las clases abstractas pueden definir métodos y variables instancias y normalmente tienen métodos abstractos. El
lenguaje Java obliga a que si una clase tiene un método abstracto la clase se declare abstracta.

Una característica importante es que no se pueden definir objetos, instanciar, de una clase abstracta.
Conceptualmente es una contradicción, además el compilador da un error siempre que se intente crear un objeto
de una clase abstracta.

public abstract class Metal


{
………..
}
Metal mer= new Metal( ); // error, no se puede instanciar de clase abstracta
No se pueden crear objetos, pero sí se definen variables de una clase abstracta. Como éstas están en lo más
alto de la jerarquía de clases, son superclases base, hay una conversión automática de referencias a clases
derivadas a clase base. Así, se puede asignar a una variable de clase base abstracta cualquier objeto concreto
de las clases derivadas.

En este ejemplo se define una arreglo de la clase abstracta Figura y se crean objetos de las clases concretas
Rectángulo y Círculo.

Figura [ ] af = new Figura [10]; // define un array


for (int i = 0; i< 10 ; i++)
{
if ( i % 2 = = 0)
af[i] = new Rectangulo( );
else
af[i] = new Circulo( );
}

Una clase abstracta se declara con la palabra reservada abstract como prefijo en la cabecera de la clase.

Una clase con al menos un método abstracto es una clase abstracta y hay que declararla como
abstracta.
Una clase derivada que no redefine un método abstracto es también clase abstracta.
Las clases abstractas pueden tener variables instancia y método no abstractos.
No se puede crear objeto de clases abstractas.

Ligadura dinámica mediante método abstracto

abstract class Libro


{
abstract public int difusión( );
abstract public void escribirDescripcion( );
//* *//}
Por omisión la ligadura es estática, pero si se coloca la palabra reservada abstract a un método, este método se
denomina abstracto y le indica al compilador que será definido (implementado su cuerpo) en una clase derivada
(no necesariamente la inmediata)

Un método miembro de una clase se debe calificar con la palabra reservada abstract, sólo cuando exista una
posibilidad de otras clases puedan ser derivadas de aquella.

Un uso común de los métodos abstracto es la declaración de clases abstractas y la implementación del
polimorfismo.

Ejemplo:

class Figura
{
public abstract doublé calcularArea( );
public abstract void dibujar( );
}

Los métodos abstractos de la clase Figura serán definidos en las clases derivadas por eso aparece (;) a
continuación del nombre y la lista de argumentos del método.

Toda clase con uno o más métodos abstractos es una clase abstracta y en Java hay que declararla con la palabra
abstract.

abstractclass Figura
{
//
}

Luego cada clase derivada debe de definir los métodos abstractos en su cuerpo.

No se pueden definir objetos, instanciar de una clase abstracta. Pero si tienen variables miembros, métodos
abstractos. Una clase con al menos un método abstracto es una clase abstracta.

Ejemplo:

Se declara una clase base abstracta A con un método abstracto y otro no. Una clase derivada de A redefine el
método abstracto. En el método main( ) se crean objetos y se asigna a una variable de la clase A.
abstract class A
{
public abstract void dinámica( );
public void estatica( )
{
System.out.println(“Métodoestático de la clase A”);
}
}
// Define clase B derivada de A, redefiniendo el método abstracto
class B extends A
{
public void dinamica( )
{
System.out.println(“Metododinamico de clase B”);
}
}
class C extends A
{
public void dinamica( )
{
System.out.println(“Metododinamico de clase C”);
}
}
classLigadura
{
public static void main(String arg[ ] )
{
A a;
B b= new B( );
C c = new C( );

}
Veamos un ejemplo de cómo luce una clase abstracta en Java para tener una mejor idea.

2. /**Una clase abstracta como ejemplo


3. /** para demostrar abstracción en Java.

9. public abstract class MiClaseAbstracta {

// Una propiedad normal como en cualquier clase

private int propiedad;

// Una constante

public static final int CONSTANTE = 1;

//Un método normal como en cualquier clase

protected int sumar (int argumento1, int argumento2) {


return argumento1 + argumento2;
}

// Un método abstracto que tiene que ser implementado por la clase que herede esta clase abstracta.

public abstract int restar(int argumento1, int argumento2);


}

Como podemos ver, en la línea 9 usamos la palabra clave “abstract” para definir esta clase como clase abstracta.
También, podemos definir propiedades, métodos con implementación y hasta métodos abstractos. Podemos usar
otros modificadores de acceso diferentes al “public”.
Clases y Métodos Abstractos en Java. (Abstract Class).

Supongamos un esquema de herencia que consta de la clase Profesor de la que heredan ProfesorInterino y
ProfesorTitular. Es posible que todo profesor haya de ser o bien ProfesorInterino o bien ProfesorTitular, es
decir, que no vayan a existir instancias de la clase Profesor. Entonces, ¿qué sentido tendría tener una clase
Profesor?

El sentido está en que una superclase permite unificar campos y métodos de las subclases, evitando la repetición
de código y unificando procesos. Ahora bien, una clase de la que no se tiene intención de crear objetos, sino que
únicamente sirve para unificar datos u operaciones de subclases, puede declararse de forma especial en Java:
como clase abstracta.

La declaración de que una clase es abstracta se hace con la sintaxis public abstract class NombreDeLaClase{ … }.
Por ejemplo public abstract class Profesor. Cuando utilizamos esta sintaxis, no resulta posible instanciar la clase,
es decir, no resulta posible crear objetos de ese tipo.

Sin embargo, sigue funcionando como superclase de forma similar a como lo haría una superclase “normal”. La
diferencia principal radica en que no se pueden crear objetos de esta clase.

Declarar una clase abstracta es distinto a tener una clase de la que no se crean objetos. En una clase abstracta,
no existe la posibilidad. En una clase normal, existe la posibilidad de crearlos aunque no lo hagamos.

El hecho de que no creemos instancias de una clase no es suficiente para que Java considere que una clase es
abstracta. Para lograr esto hemos de declarar explícitamente la clase como abstracta mediante la sintaxis que
hemos indicado.

Si una clase no se declara usando abstract se cataloga como “clase concreta”. En inglés abstract significa
“resumen”, por eso en algunos textos en castellano a las clases abstractas se les llama resúmenes. Una clase
abstracta para Java es una clase de la que nunca se van a crear instancias:

simplemente va a servir como superclase a otras clases. No se puede usar la palabra clave new aplicada a clases
abstractas, y si intentamos crear objetos en el código nos saltará un error.

A su vez, las clases abstractas suelen contener métodos abstractos: la situación es la misma. Para que un método
se considere abstracto ha de incluir en su signatura la palabra clave abstract.
Además un método abstracto tiene estas peculiaridades:

a) No tiene cuerpo (llaves): sólo consta de signatura con paréntesis.


b) Su signatura termina con un punto y coma.
c) Sólo puede existir dentro de una clase abstracta.

De esta forma se evita que haya métodos que no se puedan ejecutar dentro de clases concretas. Visto de otra
manera, si una clase incluye un método abstracto, forzosamente la clase será una clase abstracta.

d) Los métodos abstractos forzosamente habrán de estar sobreescritos en las subclases.

Si una subclase no implementa un método abstracto de la superclase tiene un método no ejecutable, lo que la
fuerza a ser una subclase abstracta. Para que la subclase sea concreta habrá de implementar métodos
sobreescritos para todos los métodos abstractos de sus superclases.

Un método abstracto para Java es un método que nunca va a ser ejecutado porque no tiene cuerpo.

Simplemente, un método abstracto referencia a otros métodos de las subclases. ¿Qué utilidad tiene un método
abstracto? Podemos ver un método abstracto como una palanca que fuerza dos cosas: la primera, que no se
puedan crear objetos de una clase. La segunda, que todas las subclases sobreescriban el método declarado como
abstracto.

Sintaxis tipo: abstract public/private/protected TipodeRetorno/void( parámetros … );

Por ejemplo: abstract public void generarNomina (int diasCotizados, boolean plusAntiguedad);

Que un método sea abstracto tiene otra implicación adicional: que podamos invocar el método abstracto sobre
una variable de la superclase que apunta a un objeto de una subclase de modo que el método que se ejecute sea el
correspondiente al tipo dinámico de la variable. En cierta manera, podríamos verlo como un método sobreescrito
para que Java comprenda que debe buscar dinámicamente el método adecuado según la subclase a la que apunte
la variable.

¿Es necesario que una clase que tiene uno o más métodos abstractos se defina como abstracta?
Sí, si declaramos un método abstracto el compilador nos obliga a declarar la clase como abstracta porque si no lo
hiciéramos así tendríamos un método de una clase concreta no ejecutable, y eso no es admitido por Java.

¿Una clase se puede declarar como abstracta y no contener métodos abstractos?

Sí, una clase puede ser declarada como abstracta y no contener métodos abstractos. En algunos casos la clase
abstracta simplemente sirve para efectuar operaciones comunes a subclases sin necesidad de métodos
abstractos. En otros casos sí se usarán los métodos abstractos para referenciar operaciones en la clase
abstracta al contenido de la sobreescritura en las subclases.

¿Una clase que hereda de una clase abstracta puede ser no abstracta?

Sí, de hecho esta es una de las razones de ser de las clases abstractas. Una clase abstracta no puede ser
instanciada, pero pueden crearse subclases concretas sobre la base de una clase abstracta, y crear instancias
de estas subclases.

Para ello hay que heredar de la clase abstracta y anular los métodos abstractos, es decir, implementarlos.

Cuando Utilizarlas?

Al trabajar clases y métodos abstractos, no solo mantenemos nuestra aplicación más organizada y fácil de
entender sino que también al no poder instanciar una clase abstracta nos aseguramos de que las propiedades
específicas de esta, solo estén disponibles para sus clases hijas.

Con las Clases Abstractas lo que hacemos es definir un proceso general que luego será implementado por las
clases concretas que hereden dichas funcionalidades, 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 será 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.
public abstract class Principal
{
/**Método concreto con implementación*/
public void método Concreto(){
...............
...............
}

/**Método Abstracto sin implementación*/

public abstract void metodoAbstracto();


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

S-ar putea să vă placă și