Embora tanto extensões como implementações de palavras-chave em Java sejam usadas para implementar o conceito de Herança da programação Orientada a Objetos, existe uma diferença sutil entre elas. A palavra-chave extends é usada principalmente para estender uma classe, ou seja, para criar uma subclasse em Java, enquanto a palavra-chave implements é usada para implementar uma interface em Java. A palavra-chave extends também pode ser usada por uma interface para estender outra interface. Para entender melhor a diferença entre extensões e implementos, você também precisa aprender e entender a diferença entre classe e interface em Java.
Embora ambas sejam parte integrante do desenvolvimento de aplicações usando a metodologia orientada a objetos, uma interface é mais abstrata que uma classe, portanto é usada para definir API ou contrato.
Por outro lado, uma classe fornece a implementação concreta da interface, ou seja, o código real que faz o trabalho. Embora uma classe também possa ser abstrata para definir um contrato, é o melhor trabalho feito por uma interface em Java. Mesmo Joshua Bloch tem aconselhado no Effective Java sobre o uso de interfaces para declarar Tipo em Java, pois ele promove múltiplas heranças em Java, o que é restrito em comparação com C++.
Even depois do Java 8, apenas múltiplas heranças de tipo e comportamento são suportadas em Java (introduzindo métodos padrão no Java 8), mas múltiplas heranças do estado ainda não são suportadas. Se você quer aprender mais sobre o porquê de as múltiplas heranças não serem suportadas em Java, veja aqui.
E, Se você é novo no mundo Java então eu também recomendo que você passe pelo The Complete Java MasterClass on Udemy para aprender Java de uma maneira melhor e mais estruturada. Este é um dos melhores e mais atualizados cursos para aprender Java online.
Qual é o significado de estender uma classe
Uma classe em Java pode estender outra classe para se tornar uma subclasse. Quando a classe B estende a classe A, B torna-se subclasse (criança) e A torna-se superclasse (pai). Uma subclasse pode reutilizar todas as características da classe pai e a reutilização do código é uma das principais razões para estender uma classe, mas poucos entendem que mais importante é a relação definidora que mais tarde é alavancada pelo Polimorfismo.
Por exemplo, se a classe B estende a classe A, então uma variável de referência do tipo A pode segurar o objeto de B, o que significa que A agora se torna polimórfica porque pode segurar tanto A quanto B. Isto dá origem a uma técnica de criação de software flexível, conhecida como programação para interface do que implementação, onde você sempre usa variáveis da classe pai ou interface para definir o algoritmo principal.
O benefício de fazer isso é qualquer nova classe que estende a classe pai terá acesso a esse algoritmo.
Aqui está um exemplo de extensão de uma classe em Java:
classe A { public void show() { System.out.println("show"); }}}classe B estende A { public void display() { System.out.println("display"); }} public void show() { System.out.println("better show"); }}}public class Main { public static void main(String args) { A a = novo B(); // possível porque B estende A a.show(); // isto agora vai chamar para show() método da classe B }}}Outputbetter show
Você pode ver que ao estender a classe A, B agora tem acesso ao método show(), ele pode até mesmo sobrescrever o comportamento do método show(), que é conhecido como método sobrescrevendo em Java. Este imenso poder vem usando a palavra-chave extends.
Você também pode ler o Head First Design Pattern em Java para aprender mais sobre a técnica de programação para interface do que implementação. O livro também é atualizado recentemente para cobrir Java SE 8.
O que significa implementar uma interface
O significado de implementar uma interface não é muito diferente de estender uma classe, mas vem com uma advertência adicional. Quando uma classe implementa uma interface ela tem que prover uma implementação de todos os métodos declarados dentro da interface. Se ela não quiser fornecer toda a implementação, ela pode se declarar como uma classe abstrata.
Não seguir estas regras significa que seu programa não pode compilar. Existem muitos exemplos de implementação de uma interface em código Java, mas acredito que implementar Runnable é o mais popular. Isto é usado para criar uma tarefa Runnable que pode ser executada por uma thread.
class R implements Runnable{public void run(){ System.out.println("do nothing"); }}}
Uma instância de R agora pode ser passada para qualquer método que espera uma Runnable como você pode passar isto tanto para executar() quanto para submeter() método da classe ExecutorService para executar aquela tarefa em um pool de threads. Como nossa classe implementou o método run(), o método único da interface Runnable, ele é uma classe concreta. Se ele não implementou o método run() você tem que torná-lo abstrato adicionando a palavra-chave abstract na frente da classe e.g.
abstract class R implements Runnable{}
Pontos Importantes
Aqui estão alguns dos pontos importantes relacionados à palavra-chave extends e implements em Java:
1) Uma classe só pode estender outra classe em Java, o uso da palavra-chave extends com a interface resultará em erro de compilação como mostrado abaixo:
interface I{}classe A{}classe B extends A{}classe C extends I{}
Quando você compila este arquivo fonte você receberá o seguinte erro:
$ javac Main.javaMain.java:27: nenhuma interface esperava hereclass C extends I{^1 error
2) Uma classe só pode estender uma classe, tentando estender mais que a classe resultará novamente em erro de compilação como mostrado abaixo:
classe C extends A, B{}$ javac Main.javaMain.java:27: '{' expectedclass C extends A, B{^1 error
3) Uma interface pode usar a palavra-chave extends para criar subinterfaces em Java e.g. following é perfeitamente legal em Java
interface J extends I{}
4) Uma interface pode até mesmo estender múltiplas interfaces usando a palavra-chave extends como mostrado abaixo:
interface k extends I, J{}
5) Uma classe pode usar a palavra-chave implements para implementar uma ou mais interfaces em Java como mostrado abaixo:
classe D implements I, J, K{}
6) Uma classe também pode usar ambas as palavras-chave extends e implements juntas para estender uma classe e implementar uma interface, é bastante comum em Java como mostrado no exemplo a seguir:
classe E estende A implementos I, J{}
Quando uma classe faz isso agora é uma subclasse de A e subinterface de I e J, o que significa que você pode usar uma variável de referência da classe E e interface I, J para armazenar o objeto classe E, como mostrado abaixo:
I i = novo E();J j j = novo E();A a = novo E();
Esta dá imenso poder à classe E em termos de uso de Herança e Polimorfismo.
7) Por último mas não menos importante, uma interface não pode usar a palavra-chave implements para implementar uma interface, é ilegal em Java e o compilador irá lançar um erro como mostrado abaixo:
interface L implements J{}javac Main.javaMain.java:49: '{' expectedinterface L implements J{^1 error
Isso é tudo sobre a diferença entre a palavra-chave extends e implements em Java. É claro que extends é geralmente usado para estender uma classe e os implementos são geralmente usados para implementar uma interface. Embora haja mais sutilezas, por exemplo, uma interface também pode estender outra interface para se tornar uma subinterface, uma classe também pode ser abstrata mesmo depois de implementar uma interface, mas o que não muda é que ambas são usadas para criar a relação pai-filho em Java.
Se a classe B estende outra classe A, ela se torna sua filha e a classe A se torna sua mãe. O mesmo é verdade com a interface. Você pode ler mais em Head First Java e Head First Object-Oriented Analysis para aprender mais sobre blocos básicos de construção de programação orientada a objetos em java.
Outras perguntas de entrevista em Java que você pode gostar
Outras aprendizagens
Aula Mestre Completa em Java
Fundamentos de Java: A Linguagem Java
Java In-Depth: Torne-se um Engenheiro Java Completo!