Por que usar Interface aos invês de Herança?

Eu gostaria de saber por que em java se deve dar prioridade para o uso de interfaces,ao invês de herança com classes

Não tem prioridade, o uso depende do caso. Interface é pra estabelecer contrato, herança é pra herdar comportamentos, a exemplo de herdar um JButton do Swing e customizar ele. O que se deve evitar é herença em requisitos dinamicos, como regras de negócio, porque o acoplamento deixa a manutenção um campo minado. Evitar herança nesse caso não significa que vai usar interface.

O que você está precisando fazer? Dependendo do que for não precisa usar nem um nem outro.

2 curtidas

Olá amigo!
Esse é um ponto de vista interessante, mas começamos do seguinte princípio a fim de complementar a resposta de @javaflex.
Herança e Interface são princípios de Orientação a Objectos (OO). Ou seja,
não somente Java, mas qualquer outra linguagem OO, devemos ter em mente a diferença e aplicabilidade destes conceitos.

Em OO, que seja a linguagem Java, a herança nos permite criar código reaproveitável, além de facilitar a abstração do sistema na criação das classes dependentes. Por exemplo:

Seja uma Classe pai “Pessoa” com a seguintes classes filhas: PessoaFisica e PessoaJuridica.
Perceba que as classes filhas poderão herdar métodos e atributos da classe “Pessoa”. Isso significa que alguma alteração na classe Pessoa, implica alterações nas classes dependentes (que herdam de 'Pessoa). Percebe o reaproveitamento de código? Mas também percebe que o nosso sistema ficará mais acoplado, dependente de certas mudanças?!.

Pois bem, Interfaces são um mecanismo de abstração que nos permite criar Classes do tipo Interface. Essas Interfaces, como o próprio nome diz, define métodos e atributos próprios que são abstratos, ou seja, não são concretos, e portanto, você não pode invocá-los diretamente.

Todas as classes que implementam uma Interface, devem seguir o que estabelece a Interface. Percebe a padronização e uma modularização do seu código?
Imagine a interface como um controle remoto e que você tenha três televisões distintas. A interface permite que você aumente o volume, ligue e desligue todas as televisões com apenas um único controle.

Perceba que sem interface, você precisaria de um controle diferente, ou seja, uma classe com métodos e atributos concretos para realizar uma mesma ação. Não seria melhor criar uma Interface, e a partir dela criar classes que implementam o seu comportamento? Na prática, instanciamos um objeto de uma classe ‘Televisao1’ e outro objeto da classe "Televisao2’. Imaginemos que a interface seja a classe “Controle”. Percebe que tais objetos possuem comportamentos distintos, pois são televisões diferentes, mas implementam o que a interface ‘Controle’ definiu. Ou seja, podemos aumentar o volume, ligar ou desligar a TV, Como? Bem, isso não importará para a Interface ou para quem for importar o seu código, compreende?

Você desacopla o seu código, pois como os métodos fazem determinada ação, não importará. Para você, basta saber quais métodos ou atributos você poderá invocar a partir de um objeto, sendo a implementação do método, uma responsabilidade de cada classe ‘Televisao’ - essa implementa uma interface, compreende?

@TheLost , Lembre-se que usar um ou outro dependerá do projeto e da real necessidade como disse @javaflex . Na prática, você pode ver mais o uso de Interfaces devido as suas vantagens. Mas, lembre-se, use-a se realmente compreende os seus benefícios em seu código. A herança também pode ser utilizada, tudo depende do projeto e do código já desenvolvido.

Recomendo que leia sobre Padrão de Projetos e sobre o príncípio SOLID. Assim, saberá quando usar e porque usar herança, interface ou qualquer outro conceito de OO.

Bons estudos e seja bem vindo @TheLost! :grinning:

2 curtidas