Pessoal,
Qual é a diferença entre uma classe Abstrata e um Interface.
Sei que uma Interface obrigatoriamente todos seus metodos já são “public abstract” por default, e que posso ter uma classe classe Abstrata sem ter um metodo abstrato.
Existe mais alguma diferença?
Obrigado.
Uma classe abstrata é quase uma interface. Oq diferencia é q a classe abstrata pode conter implentações, já a interface não.
A interface já é usada mais mesmo para criar um modelo de implementação aumentando o baixo acoplamento
Bele
Se caso ainda não tenha ficado claro … posta ai
T+
Classe abstrata é quando vc quer assegurar que naum ocorra uma instância daquela classe, tipo uma classe Mamifero, ae vc declara como abstrata, depois cria uma outra classe que extends de mamifero, como classe Cachorro.
Interface é mais ou menos pra ditar o comportamento de uma classe e como o silva.fernandes falou, na interface vc naum coloca o corpo dos metodos, apenas a assinatura. A classe que implementar essa interface escreve os métodos por ela descritos.
Entendeu?
Samuel
assim a diferença basica é que uma class abstrata eu posso ou nao implementar todos os metodos… mais na interface sou obrigado a implementar todos os metodos… pq uma interface nao extends de outra interface e uma class abstrata ela pode herda metodos de outra class abstrata… tem essa diferença tb!
Via de regra é uma boa prática fazer seu código depender de interfaces, não de classes. As interfaces representam um compromisso com o comportamento esperado, não necessariamente com um tipo especifico de implementação.
Já a superclasse, representa um acoplamento mais forte, geralmente possui algumas implementações, definindo assim um tipo e limitanto a implementação.
Uma classe sua pode implementar diversas interfaces, mas pode ter apenas uma superclasse. Assim, uma classe pode ser “Comparable” e “Clonable” ao mesmo tempo.
Por exemplo, seria impossível substituir as interfaces Clonable e Comparable por classes abstratas, mantendo a funcionalidade do código. Como você faria uma classe Comparable e Clonable ao mesmo tempo? Além do mais, como você faria para dizer que qualquer classe, hoje ou no futuro, poderia passar a suportar comparação ou clonagem? Impossível.
Não é querer discordar do camilolopes, mas já que estamos em um fórum, é bom discutirmos (por favor, me corrijam se eu estiver errado)
Eu acredito que:
Classe extends Classe
Interface extends Interface
Classe implements Interface
Nós temos que entender classe abstrata como classe, independentemente se ela vai implementar métodos ou não. No entanto interface está ligada ao que eu quero que uma classe faça. Aquilo que o ViniGodoy falou é bem certo. Acredito que a interface supre o problema gerado pela falta de herança múltipla do Java, que eu naum posso herdar duas classes, entaum a interface faz minha classe se “comportar” de tal forma. Se acaso estiver errado, fiquem a vontade. Discutir orientação ao objeto sempre é útil,
[]'s
samuel félix
Prezado Willians…
Classe abstrata é uma classe que não pode ser instanciada, tem obrigatoriamente que ter um metodo abstrato e é utilizada como um alto nivel de abstração, ex.
abstract class Pessoa, uma classe abstrata para servir de molde, dela vc extends PessoaFisica, PessoaJuridica, etc… e instancia Pessoa p = new PessoaFisica(); , Pessoa p1 = new PessoaJuridica(); você generaliza todas as informações de uma pessoa nessa classe Pessoa e nas extends vc coloca o que e especifico de cada uma.
Interface é um tipo de um contrato que vc faz para as classes se comunicarem, ex tem uma classe Funcionario (que pode ser abstract), outra FuncionarioEmpregado, outra FuncionarioGerente e outra FuncionarioDiretor, você concorda que somente as classes de FuncionariosGerente e FuncionarioDiretor terão poir exemplo, um atributo senhaDeAcesso? e se você precisar de um relatório de usuarios com senha, como fazer se todas extends de Funcionario? aí nesse caso você faz uma interface para as classes, um tipo de um contrato, voce implements para essas classes que tenham senha, juntamente com seus metodos ai vc conseguirá emitir por exemplo um relatorio, acessar, de todos que tenham senha. Conforme o tempo você saberá diferenciar melhor, porque elas são quase mesmo a mesma coisa, só vai depender de escolher uma ou outra de acordo com o que vc vai fazer, utilizar, ai vc avalia se melhor uma interface ou uma classe abstrata.
desculpa se escrevi muito…
Rodrigo
Prezado Willians…
Classe abstrata é uma classe que não pode ser instanciada, tem obrigatoriamente que ter um metodo abstrato e é utilizada como um alto nivel de abstração, ex.
abstract class Pessoa, uma classe abstrata para servir de molde, dela vc extends PessoaFisica, PessoaJuridica, etc… e instancia Pessoa p = new PessoaFisica(); , Pessoa p1 = new PessoaJuridica(); você generaliza todas as informações de uma pessoa nessa classe Pessoa e nas extends vc coloca o que e especifico de cada uma.
Interface é um tipo de um contrato que vc faz para as classes se comunicarem, ex tem uma classe Funcionario (que pode ser abstract), outra FuncionarioEmpregado, outra FuncionarioGerente e outra FuncionarioDiretor, você concorda que somente as classes de FuncionariosGerente e FuncionarioDiretor terão poir exemplo, um atributo senhaDeAcesso? e se você precisar de um relatório de usuarios com senha, como fazer se todas extends de Funcionario? aí nesse caso você faz uma interface para as classes, um tipo de um contrato, voce implements para essas classes que tenham senha, juntamente com seus metodos ai vc conseguirá emitir por exemplo um relatorio, acessar, de todos que tenham senha. Conforme o tempo você saberá diferenciar melhor, porque elas são quase mesmo a mesma coisa, só vai depender de escolher uma ou outra de acordo com o que vc vai fazer, utilizar, ai vc avalia se melhor uma interface ou uma classe abstrata.
desculpa se escrevi muito…
Rodrigo
Prezado Willians…
Classe abstrata é uma classe que não pode ser instanciada, tem obrigatoriamente que ter um metodo abstrato e é utilizada como um alto nivel de abstração, ex.
abstract class Pessoa, uma classe abstrata para servir de molde, dela vc extends PessoaFisica, PessoaJuridica, etc… e instancia Pessoa p = new PessoaFisica(); , Pessoa p1 = new PessoaJuridica(); você generaliza todas as informações de uma pessoa nessa classe Pessoa e nas extends vc coloca o que e especifico de cada uma.
Interface é um tipo de um contrato que vc faz para as classes se comunicarem, ex tem uma classe Funcionario (que pode ser abstract), outra FuncionarioEmpregado, outra FuncionarioGerente e outra FuncionarioDiretor, você concorda que somente as classes de FuncionariosGerente e FuncionarioDiretor terão poir exemplo, um atributo senhaDeAcesso? e se você precisar de um relatório de usuarios com senha, como fazer se todas extends de Funcionario? aí nesse caso você faz uma interface para as classes, um tipo de um contrato, voce implements para essas classes que tenham senha, juntamente com seus metodos ai vc conseguirá emitir por exemplo um relatorio, acessar, de todos que tenham senha. Conforme o tempo você saberá diferenciar melhor, porque elas são quase mesmo a mesma coisa, só vai depender de escolher uma ou outra de acordo com o que vc vai fazer, utilizar, ai vc avalia se melhor uma interface ou uma classe abstrata.
desculpa se escrevi muito…
Rodrigo
Rodrigo,
Uma classe abstrata não precisa ter necessariamente um método abstrato.
-
Ela pode estar adicionando métodos comuns numa interface e optar por não implementar todos os métodos. Por exemplo, AbstractTableModel.
-
Não é muito comum, mas ela pode representar um conceito abstrato e ter uma implementação concreta “default”. Por exemplo, a classe WindowAdapter é abstrata para forçar que pelo menos um método seja implementado.
-
A classe abstrata pode ser um conceito tão abstrato que não tem método nenhum! Geralmente, usos desse tipo são feitas com interfaces. Apenas queremos “marcar” uma classe que ela é desse ou daquele tipo. A partir do Java 5, é ainda preferível usar uma annotation para esses casos.
Em todos os casos, a classe abstrata não será instanciável.
Ah sim, quanto a dizer que são quase a mesma coisa… discordo também. Embora a implementação delas em alguns casos seja parecida, conceitualmente são coisas bem diferentes.
Uma classe abstrata representa um acoplamento fortíssimo, principalmente se ela contiver implementações default e métodos protegidos. Parte de seu comportamento estará publicado e as implementações nessas classes terá que ser cuidadosa.
No caso das interfaces, apenas o contrato é publicado. O compromisso com a funcionalidade é restrito apenas a quem implementa, não a interface em si.
Por isso, não é muito incomum acharmos autores dizendo que a classe abstrata define tipos, enquanto a interface apenas um comportamento observado.