segunda-feira, 5 de setembro de 2011

Dicas de Programação: Qual é a diferença entre classe abstrata e interface em Java?

Isso foi me perguntado semana passada....

A resposta:

Classe Abstrata é uma classe que não pode ser instanciada, pode possuir métodos abstratos (ou seja, sem implementação) e que somente pode ser extendida (ou seja, as classes filhas somente podem herdar de uma única classe abstrata).

Interface é uma estrutura que também não pode ser instanciada, possui sempre métodos abstratos e podem ser implementadas em várias classes (ou seja, as classes filhas podem herdar de uma ou mais interfaces).

Exemplo:

//Classe abstrata Som
abstract class Som {
    public abstract void tocar();
    public void info() {
           System.out.println("Testando som, 1, 2, 3");
    }
}

//Classe abstrata Video
abstract class Video {
     public abstract void exibir();
     public void info() {
            System.out.println("Luzes, Camera e Acao");
     }
}

//Classe Musica que extende a classe Som (funciona!)
class Musica extends Som {
       public void tocar() {
              System.out.println("Do re mi fa sol la si");
       }
}

//Classe Filme que extende as classes Video e Som (não funciona...)
class Filme extends Video, Som {
       public void tocar() {
              System.out.println("Do re mi fa sol la si");

       }
       public void exibir() {
               System.out.println("Vendo o filme");
       }

}

A classe Filme somente funcionaria, se as classes abstratas Video e Som fossem interfaces:

//Interface Video (não há implementação de método)
interface Video {
      public void exibir(); 
}

//Interface Som (não há implementação de método)
interface Som {
      public void tocar();
}

//Classe Filme que implementa as interfaces Video e Som (funciona...)
class Filme implements Video, Som {
       public void tocar() {
              System.out.println("Do re mi fa sol la si");

       }
       public void exibir() {
               System.out.println("Vendo o filme");
       }

}

Complicado, não? Mas com o tempo, a gente pega a prática... :)

Até mais!

Um comentário:

Sebastião A. L. Santos disse...

Tecnicamente é dessa forma que eles são implementados. Mas a pergunta "O que são ...?" tem a mais a ver com o fato de ambos serem abstracões que modelam classes do sistema. A classe abstrata modela uma família de classes que compartilham de atributos e/ou comportamento comuns e a interface define um contrato de comportamento comum que pode ser assumido por qualquer classe na forma de sua implementacão.