Los dos son conceptos de la programación orientada a objetos. Una clase abstracta en Java no se puede instanciar, es por ésto que las clases abstractas, como su nombre lo indica, se usa para 'abstraer' una idea y plasmarla en una clase de forma general. Es por eso, que a las subclases de una clase, se dice que son 'especialistas', ya que ellas implementan los métodos de la clase abstracta y la hacen especialmente funcional para esta clase.
Ej:
public abstract class Animal {
// a diferencia de las interfaces una clase abstracta puede
// contener variables de instancia y metodos no abstractos
// las subclases deben implementar este metodo (especializacion)
public abstract void accion();
public void setNombre
(String nombre
) { this.nombre = nombre;
}
public String getNombre
() { return nombre
; }
}
public class Perro extends Animal {
// hereda String nombre
@Override
public void accion() {
System.
out.
println("Guarf, Guarf! Grrrrr"); }
// hereda los setters y getters
}
public class Gato extends Animal {
// hereda String nombre
@Override
public void accion() {
System.
out.
println("Miau, miau..."); }
// hereda setters y getters
}
Animal animal = new Animal(); // ERROR. No se puede instanciar una clase abstracta
Animal animal = new Perro(); // OK. Un Perro es un animal, y Perro no es abstracto por lo esto es valido
public void actuar(Animal animal) { // si Animal fuera una interface tambien funcionaria esto
// sea perro o gato, esto se determina en tiempo de ejecucion y llama al metodo accion() correspondiente
animal.accion();
}