Qual é a diferença entre interface e classe abstrata ?
Pois uma classe que irá herdar de uma classe abstrata com métodos abstratos obrigatóriamente precisa sobrescrever o método, e uma classe que irá implementar uma interface também é obrigado a sobrescrever o método.
Uma classe abstrata pode ter métodos não abstratos, o que não ocorre em uma interface.
Só comentando um pouco em cima da informação do Marcio, lembre-se que os métodos de uma interface vão ser sempre públicos e abstratos.
Abraço a todos…
Na classe abstrata você pode definir quais métodos você quer que as classes filhas implementem, além, também, de poder implementar métodos dentro dela.
Ex:
[code]
public abstract class A {
public void teste() {
doSomething();
}
protected abstract void doSomething();
}[/code]
No exemplo acima, todas as classes filhas de A deverão implementar o método doSomething(), mas não o método teste().
Ex:
public class B extends A {
public B() {}
protected void doSomething() {
...
}
}
Assim, posso chamar o método teste() da classe B, que executará o doSomething() sobrescrito da classe A, sem precisar do teste() em B. O exemplo é inútil, mas é pra ter idéia. ^^
Já a interface te obriga a implementar todos os métodos lá declarados, e dentro de uma interface haverá somente as assinaturas dos métodos, além de constantes.
Geralmente você usa class abstrata(herança) quando você tem um “padrão” comum e a interface quando você tem características em comum. Imagine que temos:
- Funcionarios ( Faxineiro, Gerente, Diretor)
Aqui você pode criar uma classe abstrata Funcionario que vai servir como superclasse para: Faxineiro, Gerente e Diretor. Pois todos seguem um padrão (rg, nome, cpf, matricula, etc…)
Agora digamos digamos que existem funcionarios que possuem senha para acessar o sistema, os quais você precisará criar em suas respectivas classes o atributo senha e o metodo autentica. Por que não criaria na classe abstrata Funcionarios? Faxineiro não acessa o sistema não precisa de senha!! E quando quisermos criar um metodo que use como argumento qualquer Funcionario que seja atutenticavel como faremos? Aí é que entra a interface… Podemos criar uma interface autenticável
interface Autenticavel{
boolean autentica(int senha);
}
agora implementamos Gerente e Diretor como Autenticavel
public class Gerente extends Funcionarios implements Autenticavel{
...
...
public class Diretor extends Funcionarios implements Autenticavel{
...
...
Pronto… para que serve então a interface Autenticavel? Agora podemos criar um metodo em outra classe que leva como argumento qualquer Funcionario autenticavel:
public class TesteInterface{
void login(Autenticavel funcionario){
...
...
Pronto! No metodo acima você poderia usar como argumento Diretor ou Gerente. Porém não poderia usar Faxineiro, pois ele não pertence a interface Autenticavel. É uma questão de referência.
Não sei se respondi sua dúvida…
Abraço…
Obrigado a todos, pergunta exclarecida .