Você está aqui: Java ::: Perguntas e Respostas ::: Programação Orientada a Objetos |
Qual a diferença entre classe abstrata e interface em JavaQuantidade de visualizações: 817 vezes |
Esta é uma pergunta clássica feita pelos estudantes de programação orientada a objetos em Java, e merece uma discussão mais aprofundada, com exemplos. Vamos começar então. 1) Uma classe abstrata pode possuir variáveis de instância, enquanto uma interface não pode conter variáveis de instância. Veja: package arquivodecodigos; public interface Boleto{ Este código compila normalmente, mas, dentro da IDE, temos uma advertência do tipo "O nome da constante não segue as convenções de nome codigo". O que é isso? Este warning diz que devemos trocar a variável de instância por uma constante. Veja: package arquivodecodigos; public interface Boleto{ Agora a advertência some, ou seja, uma interface pode possuir constantes, mas não pode possuir variáveis de instância. E isso fazer sentido. Como não é possível usar new para construir uma instância de uma interface, não há vantagem nenhuma em definirmos variáveis de instância nas mesmas. 2) Uma classe abstrata pode possuir um construtor, enquanto uma interface não pode conter métodos construtores. Veja: package arquivodecodigos; public interface Boleto{ // construtor da interface Este código não compila, e temos duas mensagens de erro de compilação: "invalid method declaration: return type required" e "interface abstract methods cannot have body". Novamente isso faz sentido. Como não podemos usar new para construir um objeto de uma interface, não há porque ela possuir métodos construtores. 3) Uma classe abstrata pode conter métodos implementados com corpo (método não abstratos), enquanto uma interface pode conter somente métodos abstratos (sem corpo). Veja: package arquivodecodigos; public interface Boleto{ public int somar(){ Este código não compila, e temos a mensagem de erro de compilação "interface abstract methods cannot have body". Para corrigir, basta retirarmos o corpo do método: package arquivodecodigos; public interface Boleto{ Agora o código compila normalmente, uma vez que o objetivo da interface é delegar a funcionalidade de seus métodos às classes que optarem por implementá-las (implements). Mas, tenha em mente que, a partir do Java 1.8, uma interface pode ter métodos estáticos. Veja: package arquivodecodigos; public interface Boleto{ public static int somar(int a, int b){ return a + b; } } |
![]() |
Desafios, Exercícios e Algoritmos Resolvidos de Java |
Veja mais Dicas e truques de Java |
Dicas e truques de outras linguagens |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |