martes, 9 de febrero de 2016

Clases abstractas

Supongamos una clase vehículo:
public class Vehiculo{

    int capacidad;
    double peso;
    double longitud;

}

Estos son atributos que pueden heredar sus clases hijas que podrían ser por ejemplo Tren, Avión o Moto. Cada uno tiene un peso, una longitud o una capacidad para llevar pasajeros. Pero ahora imaginemos un método moverse que diga cómo se desplaza el vehículo y por dónde:
    public class Vehiculo{

    int capacidad;
    double peso;
    double longitud;

//Método moverse
    public void moverse(){
    System.out.println("Navego por los mares");
    }

}

Esta claro que ese método no tiene sentido alguno si se trata de un avión, una moto o un tren. Todos ellos deben tener un método moverse pero el código dentro del método será distinto en cada uno. La clase vehículo en realidad nunca será instanciada. Es decir, no vamos a crear objetos de la clase vehículo. Lo que crearemos serán objetos de la clase moto, barco, avión, etc. Es decir, las clases hijas. Por tanto, el método moverse en la clase madre vehículo debe estar vacío. Ese método vacío que luego se "rellena" de forma distinta en cada hija, es un método ABSTRACTO. Y una clase madre que posee un método abstracto es a su vez una clase abstracta.
¿Está claro, no? Una clase abstracta es una clase que no va a ser instanciada. Si una clase pose un método abstracto la clase es abstracta. Y un método abstracto es un método vacío que se utiliza en las clases hijas de la clase abstracta. Hay circunstancias en las que una clase puede ser declarada abstracta, ya que no va a instanciarse, pero que en realidad no tiene un método abstracto. Pero no conozco aún esas circunstancias.
Una clase abstracta se declara así:

abstract class Cliente {

    
}
Dentro de ella el método abstracto moverse quedaría de esta forma:
abstract class Cliente {


    int capacidad;
    double peso;
    double longitud;

//Método moverse
    abstract void moverse()
    
}
El método moverse tiene dos características: Lleva la palaba abstract y no tiene llaves porque dentro no lleva código. Cuando crees la clase hija barco sí que el método tendrá código en su interior:
    public void moverse(){

    System.out.println("Navego por los mares");

    }

O en la clase hija avión:
    public void moverse(){

    System.out.println("Vuelo por los aires");

    }

Off-topic: El estilo del blog está feo porque he tenido que remodelarlo rápidamente para mostrar código fuente en las entradas. Ya lo iré puliendo poco a poco. Como siempre, espero que me corrijan cualquier posible error ya que el nombre lo indica este blog se escribe con conocimientos adquiridos desde cero.