Tutoriales de informática - Abrirllave.com

Abrirllave.com

Clases abstractas en Java

En Java se dice que son clases abstractas aquellas clases base (superclases) de las que no se permite la creación de objetos. Para ello, se utiliza la palabra clave abstract.

Métodos abstractos

En una clase abstracta es posible definir métodos abstractos, los cuales se caracterizan por el hecho de que no pueden ser implementados en la clase base. De ellos, solo se escribe su signatura en la superclase, y su funcionalidad –polimórfica– tiene que indicarse en las clases derivadas (subclases).

EJEMPLO Dadas la siguientes clases (Figura, Cuadrado y Triangulo):

public abstract class Figura
{
    private String color;

    public Figura(String color)
    {
        this.color = color;
    }

    public abstract double calcularArea();

    public String getColor()
    {
        return color;
    }
}

En la clase Figura se ha definido un atributo (color), un constructor y dos métodos (calcularArea y getColor).

public class Cuadrado extends Figura
{
    private double lado;

    public Cuadrado(String color, double lado)
    {
        super(color);
        this.lado = lado;
    }

    public double calcularArea()
    {
        return lado * lado;
    }
}

En la clase Cuadrado se ha definido un atributo (lado), un constructor y un método (calcularArea).

public class Triangulo extends Figura
{
    private double base;
    private double altura;

    public Triangulo(String color, double base, double altura)
    {
        super(color);
        this.base = base;
        this.altura = altura;
    }

    public double calcularArea()
    {
        return (base * altura) / 2;
    }
}

En la clase Triangulo se han definido dos atributos (base y altura), un constructor y un método (calcularArea).

Como se puede observar, el método calcularArea ha sido definido abstracto (abstract) en la superclase abstracta Figura, indicándose solamente su signatura:

public abstract double calcularArea();

Por otro lado, véase que, en cada una de las subclases (Cuadrado y Triangulo) se ha implementado dicho método.

EJEMPLO { PruebaCuadrado } Al compilar y ejecutar el siguiente código:

import java.util.Scanner;

public class PruebaCuadrado
{
    public static void main(String[] args)
    {
        String colorDelCuadrado;
        double ladoDelCuadrado;

        Scanner teclado = new Scanner(System.in);

        System.out.print("Introduzca el color del cuadrado: ");
        colorDelCuadrado = teclado.nextLine();

        System.out.print("Introduzca el lado del cuadrado: ");
        ladoDelCuadrado = teclado.nextDouble();

        Cuadrado cuadrado1 = new Cuadrado(colorDelCuadrado, ladoDelCuadrado);

        System.out.printf("El área del cuadrado %s es: %f", cuadrado1.getColor(), cuadrado1.calcularArea());
    }
}

En la pantalla se podrá ver, por ejemplo:

Ejecución del programa PruebaCuadrado escrito en Java, donde se muestra el área de un cuadrado.

EJEMPLO { PruebaTriangulo } Al compilar y ejecutar:

import java.util.Scanner;

public class PruebaTriangulo
{
    public static void main(String[] args)
    {
        String colorDelTriangulo;
        double baseDelTriangulo;
        double alturaDelTriangulo;

        Scanner teclado = new Scanner(System.in);

        System.out.print("Introduzca el color del triángulo: ");
        colorDelTriangulo = teclado.nextLine();

        System.out.print("Introduzca la base del triángulo: ");
        baseDelTriangulo = teclado.nextDouble();

        System.out.print("Introduzca la altura del triángulo: ");
        alturaDelTriangulo = teclado.nextDouble();

        Triangulo triangulo1 = new Triangulo(colorDelTriangulo, baseDelTriangulo, alturaDelTriangulo);

        System.out.printf("El área del triángulo %s es: %f", triangulo1.getColor(), triangulo1.calcularArea());
    }
}

En el Símbolo del sistema se mostrará algo similar a:

Ejecución del programa PruebaTriangulo escrito en Java, donde se muestra el área de un triángulo.

Fíjese que, tanto en PruebaCuadrado como en PruebaTriangulo se ha invocado al método getColor definido e implementado en la superclase Figura. Sin embargo, el método abstracto calcularArea únicamente se implementa en las subclases (Cuadrado y Triangulo).