Diferença entre Classe Abstrata e Interface em Java

Diferença entre Classe Abstrata e Interface é uma das perguntas populares em entrevistas. Classe Abstrata e Interface são partes essenciais da linguagem de programação Java. Escolher entre uma interface ou classe abstrata é uma decisão de design que todo arquiteto enfrenta. Em meus artigos anteriores, forneci o máximo de detalhes possível sobre a interface Java e classe abstrata. Neste post, aprenderemos sobre a diferença entre classe abstrata e interface, e quando devemos usar interface em vez de classe abstrata e vice-versa.

Diferença entre Classe Abstrata e Interface

  1. A palavra-chave abstract é usada para criar uma classe abstrata e pode ser usada com métodos, enquanto a palavra-chave interface é usada para criar uma interface e não pode ser usada com métodos.
  2. Subclasses usam a palavra-chave extends para estender uma classe abstrata e precisam fornecer implementação para todos os métodos declarados na classe abstrata, a menos que a subclasse também seja uma classe abstrata. Já as subclasses usam a palavra-chave implements para implementar interfaces e devem fornecer implementação para todos os métodos declarados na interface.
  3. Classes abstratas podem ter métodos com implementação, enquanto interfaces fornecem abstração absoluta e não podem ter nenhuma implementação de método. Note que a partir do Java 8, podemos criar métodos padrão e estáticos em interfaces que contêm as implementações de método.
  4. As classes abstratas podem ter construtores, mas as interfaces não podem ter construtores.
  5. A classe abstrata possui todas as características de uma classe Java normal, exceto que não podemos instanciá-la. Podemos usar a palavra-chave abstract para tornar uma classe abstrata, mas as interfaces são um tipo completamente diferente e podem ter apenas constantes públicas estáticas finais e declarações de método.
  6. Os métodos de classes abstratas podem ter modificadores de acesso como público, privado, protegido e estático, mas os métodos de interface são implicitamente públicos e abstratos, não podemos usar nenhum outro modificador de acesso com os métodos de interface.
  7. A subclass can extend only one abstract class but it can implement multiple interfaces.
  8. As classes abstratas podem estender outras classes e implementar interfaces, mas as interfaces só podem estender outras interfaces.
  9. Podemos executar uma classe abstrata se ela tiver um método main(), mas não podemos executar uma interface porque elas não podem ter implementação de método main.
  10. As interfaces são usadas para definir contrato para as subclasses, enquanto a classe abstrata também define contrato, mas pode fornecer outras implementações de métodos para as subclasses usarem.

Isso é tudo para a diferença entre uma interface e classes abstratas, agora podemos prosseguir para saber quando devemos usar Interface em vez de classe abstrata e vice-versa.

Interface ou Classe Abstrata

A escolha entre Interface ou classe abstrata para fornecer um contrato para subclasses é uma decisão de design e depende de muitos fatores. Vamos ver quando as Interfaces são a melhor escolha e quando podemos usar classes abstratas.

  1. O Java não suporta herança de nível de classe múltipla, então cada classe pode estender apenas uma superclasse. Mas uma classe pode implementar várias interfaces. Assim, na maioria das vezes, Interfaces são uma boa escolha para fornecer a base para a hierarquia de classes e contrato. Além disso, programar em termos de interfaces é uma das melhores práticas para codificar em Java.
  2. Se houver muitos métodos no contrato, então a classe abstrata é mais útil porque podemos fornecer uma implementação padrão para alguns dos métodos que são comuns a todas as subclasses. Além disso, se as subclasses não precisarem implementar um método específico, podem evitar fornecer a implementação. No caso da interface, a subclasse terá que fornecer a implementação para todos os métodos, mesmo que não tenham utilidade e a implementação seja apenas um bloco vazio.
  3. Se nosso contrato base estiver em constante mudança, as interfaces podem causar problemas porque não podemos declarar métodos adicionais na interface sem alterar todas as classes de implementação. Com a classe abstrata, podemos fornecer a implementação padrão e alterar apenas as classes de implementação que realmente usarão os novos métodos.

Usar classes abstratas e interfaces ao mesmo tempo

Usar interfaces e classes abstratas juntas é a melhor abordagem para projetar um sistema. Por exemplo, no JDK java.util.List é uma interface que contém muitos métodos, então existe uma classe abstrata java.util.AbstractList que fornece uma implementação esquelética para todos os métodos da interface List, para que qualquer subclasse possa estender esta classe e implementar apenas os métodos necessários. Devemos sempre começar com uma interface como base e definir métodos que toda subclasse deve implementar e, em seguida, se houver alguns métodos que apenas certas subclasses devem implementar, podemos estender a interface base e criar uma nova interface com esses métodos. As subclasses terão a opção de escolher entre a interface base ou a interface filha para implementar de acordo com seus requisitos. Se o número de métodos crescer muito, não é uma má ideia fornecer uma classe abstrata esquelética implementando a interface filha e fornecendo flexibilidade às subclasses para escolher entre interface e uma classe abstrata.

Alterações na interface Java 8

A partir do Java 8, podemos ter implementações de métodos nas interfaces. Podemos criar métodos padrão, bem como métodos estáticos nas interfaces e fornecer uma implementação para eles. Isso tem preenchido a lacuna entre classes abstratas e interfaces e agora as interfaces são o caminho a seguir porque podemos estendê-las ainda mais fornecendo implementações padrão para novos métodos. Para mais detalhes, confira Java 8 interface default static methods.

Source:
https://www.digitalocean.com/community/tutorials/difference-between-abstract-class-and-interface-in-java