Aqui no forum já tem bastante coisa sobre isso, se você procurar vai achar, mas mesmo assim aí vai uma resposta:
Na realidade nenhuma das duas tem a declaração do corpo dos metodos, veja:
[code]public interface MinhaInterface{
public void metodo();
}
public abstract class MinhaClasse{
public abstract void metodo();
}[/code]
Só que uma classe abstrata pode ter metodos não abstratos, e atributos não estaticos, o que não pode ser feito com uma interface, então com uma classe abstrata você pode criar todo o algoritmo da classe, e deixar somente um, ou mais, metodo especifico para ser implementado nas subclasses. Mas a principal diferença é que uma classe abstrata é uma classe como outra qualquer e portanto participa de uma hierarquia de classes, então uma subclasse de uma classe abstrata só pode estender essa classe abstrata, não pode estender duas classes por exemplo, enquanto com interfaces podem ser implementadas quantas forem preciso já que elas não participam da hierarquia das classes.
ex.:
[code]public interface Corredor{
public void correr();
}
public class Homem implements Corredor{
public void correr(){
System.out.println(“Homem correndo…”);
}
}
public class Animal{
}
public class Cao extends Animal implements Corredor{
public void correr(){
System.out.println(“Cao correndo…”);
}
}[/code]
Veja que a classe Cao estende a classe Animal e ao mesmo tempo implementa a interface Corredor, isso nao seria possivel com uma classe abstrata.
[code]public abstract class Corredor{
public abstract void correr();
}
public class Homem extends Corredor{
public void correr(){
System.out.println(“Homem correndo…”);
}
}
public class Animal{
}
public class Cao extends Animal{ //nao é possivel estender Corredor
}[/code]
Geralmente as interfaces são usadas mais frequentemente, mais isso nao significam que elas sejam melhores que as classes abstratas, elas tem objetivos diferentes, e são usadas em situações diferentes.
Basicamente você usa uma interface pra adicionar metodos especificos à uma classe, fazendo com que ela implemente esses metodos.
Já uma classe abstrata é usada para manter uma parte da classe sem implementação, e deixar que as subclasses implementem essa parte.