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.