Extends vs Implements: qual a diferença?

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!