O que eu sempre leio na internet é
“com o Implements vc implementa uma Interface e com o Extends vc extende uma classe”…
Mas aí continuo sem entender nada…
Vejam se eu entendi: se eu quero herdar um método, sem precisar sobrescrever, uso o extends e uma classe-mãe.
Se eu precisar sobrescrever os métodos, uso o implements e uma interface.
É isso? Com o extends não consigo sobrescrever né?
extends aplica o conceito de herança, uma classe com extends herda todos os atributos e métodos da classe mãe.
Exemplo:
public class Pessoa {
public Long id;
public String nome;
}
public class PessoaFisica extends Pessoa {
public String cpf;
}
public class PessoaJuridica extends Pessoa {
public String cnpj;
}
Neste pequeno exemplo as classes PessoaFisica
e PessoaJuridia
herdam os atributos da classe Pessoa
.
O conceito do uso de interfaces tem relação com o polimorfismo, através de uma interface você estabelece um contrato, isso permite manter um nível baixo de acoplamento, pois as classes que a utilizam não precisam conhecer a implementação da mesma.
Exemplo:
public interface Animal {
public void faz();
}
public class Cachorro implements Animal {
@Override
public void faz() {
System.out.println("Au au au...");
}
}
public class Gato implements Animal {
@Override
public void faz() {
System.out.println("Miau miau miau...");
}
}
public class Teste {
public static void main(String ... args) {
Animal gato = new Gato();
Animal cachorro = new Cachorro();
gato.faz(); //Miau miau miau...
cachorro.faz(); //Au au au...
}
}
Neste exemplo simples acima perceba que a interface Animal
estabele um contrato padrão para quem a implementar, neste caso as classes Gato
e Cachorro
cada uma com um comportamento único!
Na classe de teste, perceba que usamos a interface Animal
recebendo a implementação de Gato
e Cachorro
, logo temos um baixo acoplamento, desta forma podemos modificar tranquilamente as nossas classes Gato
e Cachorro
sem que a classe Teste
sofra grandes impactos, pois não dependemos das classes concretas e sim da interface que estas classes implementam.
Mas eu consigo sobrescrever um método com o extends?
Se sim, qual a vantagem de usar a Interface?
Consegue sim, porém a sobrescrita modifica o comportamento do método em relação a sua super classe.
São aplicáveis em contextos distintos, uma não substituí a outra!
A principal vantagem de utilizar interfaces é o alto desacoplamento de código que é ganho!