¿Qué es una clase abstracta en java?

logos del 85
09 de Julio del 2008
Soy un novato en la programación.
Quiero saber si hay alguien quien me pueda resolver esta duda, por que yo no logro resolverla.
Ya llevo un buen tiempo investigaando y no le doy respuesta a mi dada.
Gacias por su ayuda!!!

Jorge
09 de Julio del 2008
Para definir una clase abstracta hay dos puntos importantes que se deben entender :

1. Cuando se define una clase abstracta no se podra crear instancias de esta clase. Esto significa de que no podras hacer esto MiClaseAbstracta MiObjeto = new MiClaseAbstracta();

2.El segundo punto es que defines métodos los cuales no serán implementados en la clase Abstracta sino mas bien en una clase que derive de esta clase abstracta la cuál si implementara dichos métodos. Pero tambien se debe aclarar de que este punto no es del todo cierto la mayor parte de las veces no se implementan los métodos pero en otras sí, esta permitido pero se supone que lo que estas definiendo es comportamiento.

Por ejemplo se quiere implementar un simulador de carrera con diferentes tipos de Automoviles(Coches) pudiendo estos ser un Escarabajo(menos rapido), Toyota Celica(mas rapido) y otros mas entonces como primer punto vemos de que existe un comportamiento similar en todos estos Automoviles que es acelerar, frenar, Cambiar Caja y algo mas que se le pueda encontrar.

Entonces analizando el problema surge una duda los diferentes coches tienen el mismo comportamiento pero lo realizan de diferente manera. El escarabajo acelerara con menos rapidez que el celica y otros, de igual forma se ve esto en el cambio de caja. Entonces como solucion a esto se puede plantear la creacion de una clase abstracta que me defina el comportamiento y las clases que deriven de esta las implementen segun su propio comportamiento.
--------------------------------------------------
abstract class Automovil {
. . .
abstract void acelerar();
abstract void frenar();
abstract void cambiar_de_caja();
. . .
}

class Escarabajo extends Automovil {
. . .
void acelerar() {
// codigo para dibujar Circulo
. . .
}
void frenar() {
// codigo para dibujar Circulo
. . .
}
void cambiar_de_caja() {
// codigo para dibujar Circulo
. . .
}
}

class Celica extends Automovil {
. . .
void acelerar() {
// codigo para dibujar Circulo
. . .
}
void frenar() {
// codigo para dibujar Circulo
. . .
}
void cambiar_de_caja() {
// codigo para dibujar Circulo
. . .
}
}
----------------------------------------------------
Luego ya podras instanciar de las clases derivadas

Escarabajo MiEscarabajo = new Escarabajo();
Celica MiCelica = new Celica();
----------------------------------------------------
Nota.- * No sera necesario implementar todos los métodos en las clases que deriven de una abstracta eso si deberas declararlos.
* Basta con que definas a un método abstracto para que toda la clase se defina como abstracta

Bueno Espero que la explicación te sea de utilidad y cualquier duda hazla saber.