diferença entre classe abstrata e interface

uma duvidad e iniciante:
fora o fato de que uma classe abstrata tem a declaração do corpo dos métodos e uma interface tem apenas a assinatura dos métodos, quais são as diferenças entre uma classe abstrata e uma interface?
quando é melhor usar cada uma delas?

grato

julio romano

Uma interface é na verdade uma classe 100% abstrata.A classe abstrata pode ter metodos concretos, o que nunca ocorre numa interface.Como java não tem herança multipla voce so pode herdar de uma classe mas pode implementar varias interfaces.Sobre quando usar cada uma delas, ai depende do que voce vai fazer.

hmmm
onde eu poderia encontrar exemplos de o que é melhor e quando?

grato

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.

Você vai usar uma classe abstrata quando você tiver uma classe comum mas com um, ou alguns, metodos que nao tem uma implementação especifica.

Já uma interface é usada para criar um tipo generico totalmente abstrato, que nao conhece nada sobre a implementação.