En la programación orientada a objetos con Java, las clases abstractas permiten definir una estructura común para múltiples subclases, ipmoniendo la implementación de ciertos comportamientos sin especificar cómo se realizan. A continuación se presenta un ejemplo práctico que ilustra este concepto mediante el cálculo del área y perímetro de distintas figuras geométricas.
Clase abstracta base: Figura
import java.text.DecimalFormat;
abstract class Figura {
protected String tipo;
protected Figura(String tipo) {
this.tipo = tipo;
System.out.print("Figura: " + tipo);
}
public abstract double calcularArea();
public abstract double calcularPerimetro();
}
Esta clase define:
- Un atributo protegido
tipopara identificar la figura. - Un constructor que inicializa dicho tipo y lo imprime.
- Dos métodos abstractos:
calcularArea()ycalcularPerimetro(), que deben ser implementados por cada subclase.
Subclase Circulo
class Circulo extends Figura {
private static final double PI = Math.PI;
private double radio;
public Circulo(String nombre, double r) {
super(nombre);
this.radio = r;
}
@Override
public double calcularArea() {
return PI * radio * radio;
}
@Override
public double calcularPerimetro() {
return 2 * PI * radio;
}
}
El círculo implementa los métodos abstractos usando fórmulas específicas y utiliza Math.PI para mayor precisión.
Subclase Rectangulo
class Rectangulo extends Figura {
private double ancho;
private double alto;
public Rectangulo(String nombre, double ancho, double alto) {
super(nombre);
this.ancho = ancho;
this.alto = alto;
}
@Override
public double calcularArea() {
return ancho * alto;
}
@Override
public double calcularPerimetro() {
return 2 * (ancho + alto);
}
}
El rectángulo también implementa los métodos según sus propias reglas geométricas.
Clase principal de prueba
public class PruebaFiguras {
public static void main(String[] args) {
Figura rect = new Rectangulo("Rectángulo", 6.5, 10.3);
System.out.println("; Área=" + rect.calcularArea());
System.out.println("; Perímetro=" + rect.calcularPerimetro());
Figura circ = new Circulo("Círculo", 10.2);
DecimalFormat formato = new DecimalFormat("#.##");
System.out.println("; Área=" + formato.format(circ.calcularArea()));
System.out.println("; Perímetro=" + formato.format(circ.calcularPerimetro()));
}
}
Este programa demuestra polimorfismo: las referencias del tipo Figura apuntan a instancias concretas, permitiendo invocar métodos comunes sin conocer el tipo real en tiempo de compilación. Además, se usa DecimalFormat para presentar resultados numéricos con dos decimales.