Clases abstractas en JAVA

Con frecuencia, cuando se diseña un modelo orientado a objetos es útil introducir clases a cierto nivel que pueden no existir en la realidad pero que son construcciones conceptuales útiles. Estas clases se conocen como clases abstractas.

Una clase abstracta normalmente ocupa una posición adecuada en la jerarquía de clases que le permite actuar como un depósito de métodos y atributos compartidos para las subclases de nivel inmediatamente inferior.

Las clases abstractas no tienen instancias directamente Se utilizan para agrupar otras clases y capturar información que es común al grupo Sin embargo, las subclases de clases abstractas que corresponden a objetos del mundo real pueden tener instancias.
Ejemplo de clase abstracta

Las clases derivadas de una clase base se conocen como clases concretas, ya que se pueden instanciar (es decir se pueden tener instancias).

¿Cuándo se utilizan clases abstractas?
Cuando deseamos definir una abstracción que englobe objetos de distintos tipos y queremos hacer uso del polimorfismo.

clase-abstracta-uml

Figura 1

La Figura 1 es una clase abstracta (nombre en cursiva en UML) porque no tiene sentido calcular su área, pero sí la de un cuadrado o un círculo. Si una subclase de Figura no redefine area(), deberá declararse también como clase abstracta.

Diferencias entre clases abstractas e interfaces

Las interfaces son una lista de métodos no implementados, además puede incluir la declaración de constantes. Una clase abstracta puede incluir métodos implementados y no implementados o abstractos, miembros dato constantes y otros no constantes.
Además una clase puede derivar (heredar) extends de una clase base, pero puede implementar varios interfaces. Los nombres de los interfaces se colocan separados por una coma después de la palabra reservada implements. Una interfaz es una clase completamente abstracta (Una clase sin implementación).

Ejemplo 1:

Implementar una aplicación con clases abstractas sobre las figuras geométricas círculo y cuadrado.

package clasesabstractas;

public abstract class Figura {
    protected double x;
    protected double y;

    /** Creates a new instance of Figura */
    public Figura(double x, double y) {
        this.x = x;
        this.y = y;
    }    

    public abstract double area ();
}

/****************************************/

public class Circulo extends Figura {

    private double radio;
    private double constante;
    public Circulo (double x, double y, double radio) {
        super(x, y);
        this.radio = radio;
        this.constante = Math.PI;
    }

    public double area () {
        return Math.PI * radio * radio;
    }
}

/****************************************/

public class Cuadrado extends Figura {
    
   private double lado;
   private double constante = 1;
    public Cuadrado (double x, double y, double lado) {
        super(x, y);
        this.lado = lado;
    }
    public double area () {
        return lado * lado;
    }   
}

/****************************************/

public class Main {
    
    public Main() {
    }

    public static void main(String[] args) {
        Circulo ci = new Circulo(1, 1, 1);
        System.out.println(ci.area());

        Cuadrado cu = new Cuadrado(1, 1, 1);
        System.out.println(cu.area());               
    }    
}


Salida:
compile:
run:
3.141592653589793
1.0
GENERACIÓN CORRECTA (tiempo total: 2 segundos)
/****************************************/

Ejemplo 2:

Implementar una aplicación con clases abstractas sobre vehículos, motos y carros.

package clasesabstractas2;

public abstract class vehiculo {
    public double potencia;
    public double peso;
    /** Creates a new instance of vehiculo */
    public vehiculo(double potencia, double peso) {
        this.potencia = potencia;
        this.peso = peso;
    }
    public double relacionPesoPotencia() {
        if (this.potencia > 0) {
          return this.peso / this.potencia;
        }
        return -1;
  }

  //// devuelve el tiempo en alcanzar los 100 Km/h
  //// partiendo de cero, cada tipo de vehiculo tendra una
  //// aceleracion aproximada en funcion de sus caracteristicas
  abstract double aceleracionAproximada();
}

/****************************************/

package clasesabstractas2;

public class Moto extends vehiculo {
    
    //// una Moto es un Vehiculo
    public Moto(double potencia, double peso) {
        super(potencia, peso);
    }
    
    //// devuelve el tiempo en alcanzar los 100 Km/h
    //// partiendo de cero
    double aceleracionAproximada() {
        double coeficienteTransmision = 3.0;
        double t = this.peso * 771.73 / (2.0 * this.potencia * 735);
        t = t * coeficienteTransmision;
        return t;
  }
}

/****************************************/

package clasesabstractas2;

public class Carro extends vehiculo{
    
    /** Creates a new instance of Carro */
    public Carro(double potencia, double peso){
        super(potencia,peso);
    }
    
     double aceleracionAproximada() {
        double coeficienteTransmision = 2.2;
        double t = this.peso * 771.73 / (2.0 * this.potencia * 735);
        t = t * coeficienteTransmision;
        return t;
  }
}


Salida:
init:
deps-jar:
compile-single:
run-single:
coche (0-100): 12.011688707482994
moto (0-100): 6.56232993197279
GENERACIÓN CORRECTA (tiempo total: 0 segundos)

Acerca de Daniel

Soy ingeniero de sistemas con muchos años de experiencia en el desarrollo de software y gestión de proyectos. El objetivo al desarrollar este sitio web el de brindar información y conocimientos, tanto a nivel académico como profesional sobre diversas tecnologías involucradas en las disciplinas computacionales. Confio en brindar información lo mas didactica y clara en lo referente contenido académico. Así como ejemplos y casos reales de soluciones problemas que se presentan en un entorno de producción.
Esta entrada fue publicada en Java, Programación Básica y etiquetada . Guarda el enlace permanente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>


Última modificación: 14/04/2013