Cuando me preguntan cuál es la diferencia entre una clase y una clase abstracta, les respondo que una clase abstracta, a diferencia de una normal, no puede instanciarse. Esto quiere decir que no es posible crear o instanciar un objeto a partir de una clase abstracta. Además, una clase abstracta nos permite tener atributos y métodos abstractos, algo que no es posible en una clase normal.
- Ok ok, pero... ¿Esto para qué sirve entonces, si no puedo crear objetos de esta clase?
Una clase abstracta sirve para darle forma a otras clases a través de la Herencia. Por ejemplo, imaginemos que tenemos 3 clases, Animal, Perro y Gato. Animal es la clase abstracta porque no sabemos qué tipo de animal representa, y Gato y Perro son clases normales hijas de la clase Animal que es abstracta.
La clase Animal tiene el método:
abstract void emitirSonido()
- Oye oye, pero ese método no sirve, no tiene cuerpo, no hace nada!
No es que no sirva, es abstracta, no sabemos cómo funciona. El perro y gato lo sabrán porque heredarán la firma de este método y ellos implementarán la funcionalidad. Entronces la clase perro tendrá el siguiente método
@Override
void emitirSonido(){
System.out.println("Guau!");
}
Mientras que Gato tendrá el siguiente método, también heredado de la clase Animal:
@Override
void emitirSonido(){
System.out.println("Miau");
}
así es, son perros y gatos comunes y corrientes que emiten sonidos de perros y gatos comunes y corrientes. ¿Qué esperabas, que hablaran?
De cualquier modo, a esto también se le conoce como Polimorfismo. ¿Bonito, verdad?