Quando você deve usar uma classe abstrata versus uma interface? qual é a diferença entre uma classe abstrata e uma interface?

Referência:

Decodejava.com apresentando tutorial Java simples e fácil.

Classe abstrata

é uma classe declarada com o

resumo

palavra-chave Ao contrário de uma classe java simples, uma classe abstrata pode não apenas conter

métodos definidos regularmente

mas também pode conter

métodos abstratos

ou uma mistura de

métodos regulares e abstratos

.

Para mais classes Abstratas, métodos abstratos e suas várias regras em exemplos fáceis de código

, você pode ler

Classe abstrata de Java- Decodejava.com

Interface

é um

Classe 100% abstrata

que é declarado com a palavra-chave

interface

. Métodos de interface são implicitamente

abstrato e

não pode ter

quaisquer métodos definidos regularmente.

Para mais informações sobre interface e várias regras em exemplos fáceis de código,

você pode ler

Interface em Java

Boa sorte!

Uma classe abstrata não pode ser instanciada, mas pode ser subclassificada. Uma classe abstrata geralmente contém métodos abstratos e não abstratos para os quais as subclasses são forçadas a fornecer uma implementação.

Uma interface é uma "classe abstrata" completamente usada para agrupar métodos relacionados com corpos vazios.

A seguir, estão quatro principais diferenças entre classes abstratas e interfaces:

  • Uma classe abstrata pode ter variáveis ​​finais, variáveis ​​estáticas ou variáveis ​​de membro da classe, enquanto uma interface pode ter apenas variáveis ​​finais e estáticas por padrão.
  • Uma classe abstrata pode ter métodos estáticos, abstratos ou não abstratos. Uma interface pode ter métodos estáticos, abstratos ou padrão.
  • Os membros de uma classe abstrata podem ter uma visibilidade variável de privado, protegido ou público. Enquanto que, em uma interface, todos os métodos e constantes são públicos.
  • Uma classe só pode estender outra classe, mas pode implementar várias interfaces. Da mesma forma, uma interface pode estender várias interfaces. Uma interface nunca implementa uma classe ou uma interface.

Use uma classe abstrata quando as subclasses compartilharem estado ou usarem funcionalidade comum. Ou você precisa declarar campos não estáticos e não finais ou precisa de modificadores de acesso que não sejam públicos.

Use uma interface se você espera que classes não relacionadas implementem sua interface. Por exemplo, as interfaces Comparable e Cloneable são implementadas por muitas classes não relacionadas. As interfaces também são usadas nos casos em que a herança múltipla do tipo é desejada.

Olhar em termos simples…

Se você tem um requisito em que toda classe derivada precisa ter sua própria implementação para cada método derivado, precisamos ir para

interface.

Se pelo menos um método precisa ter uma implementação padrão, optamos por

resumo

classe para evitar duplicação de código.

Quando você precisa ter um construtor padrão, também procuramos

resumo

classe

Classes abstratas vs Interface

  • Classes abstratas são classes especiais criadas para ser apenas uma classe base para outras classes herdá-las. As interfaces também são quase as mesmas. As classes abstratas e as interfaces não podem ser instanciadas.
  • Uma classe abstrata pode conter métodos abstratos e não abstratos. Mas até o Java 7, as interfaces podem conter apenas métodos abstratos. O Java 8 mudou isso permitindo que as interfaces também tivessem métodos estáticos e estáticos para compatibilidade binária. Até o Java 7, quando uma classe implementa uma interface, ela deve implementar todos os métodos abstratos nessa interface. Por isso, é difícil editar uma interface no último estágio, pois precisamos alterar todas as classes que implementaram essa interface. Portanto, a compatibilidade binária no Java 8 permite editar uma interface sem fazer alterações nas classes que a implementaram.
  • Uma classe pode estender apenas uma classe abstrata. Mas ele pode implementar várias interfaces.
  • A classe abstrata permite modelar uma hierarquia de classes para classes semelhantes. Por exemplo, Animal é uma classe abstrata da qual derivam a classe Dog e a classe Tiger. Interface é uma comunicação entre duas classes semelhantes ou diferentes que não se preocupam com o tipo de classe de implementação. Por exemplo, a classe Human e a classe Building podem implementar uma interface chamada Height, mesmo que sejam de natureza diferente.

~~ Tamizh

Classe abstrata e interface são usadas para obter abstração, onde podemos declarar os métodos abstratos. A classe abstrata e a interface não podem ser instanciadas.

Mas há muitas diferenças entre a classe abstrata e a interface que são dadas abaixo.

Classe abstrata

Interface

1) A classe abstrata pode

tem abstrato e não abstrato

métodos.

A interface pode ter

somente resumo

métodos. Desde o Java 8, ele pode ter

métodos padrão e estáticos

Além disso.

2) Classe abstrata

não suporta herança múltipla

.

Interface

suporta herança múltipla

.

3) Classe abstrata

pode ter variáveis ​​finais, não finais, estáticas e não estáticas

.

Interface possui

apenas variáveis ​​estáticas e finais

.

4) Classe abstrata

pode fornecer a implementação da interface

.

Interface

não pode fornecer a implementação da classe abstrata

.

5) O

palavra-chave abstrata

é usado para declarar classe abstrata.

o

palavra-chave da interface

é usado para declarar interface.

6)

Exemplo:

classe abstrata pública Shape {public abstract void draw ();}

Exemplo:

interface pública Drawable {void draw ();}

Simplesmente, a classe abstrata atinge a abstração parcial (0 a 100%), enquanto a interface atinge a abstração total (100%).

Exemplo de classe abstrata e interface em Java

Vamos ver um exemplo simples em que estamos usando a interface e a classe abstrata.

  • // Criando interface que possui 4 métodos
  • interface A {
  • void a (); // bydefault, public e abstract
  • vazio b ();
  • void c ();
  • vazio d ();
  • }
  • // Criando classe abstrata que fornece a implementação de um método da interface A
  • a classe abstrata B implementa A {
  • public void c () {System.out.println ("eu sou C"));}
  • }
  • // Criando subclasse da classe abstract, agora precisamos fornecer a implementação do restante dos métodos
  • classe M estende B {
  • public void a () {System.out.println ("eu sou um");}
  • public void b () {System.out.println ("eu sou b");}
  • public void d () {System.out.println ("eu sou d");}
  • }
  • // Criando uma classe de teste que chama os métodos da interface A
  • classe Test5 {
  • public static void main (String args []) {
  • A a = novo M ();
  • aa ();
  • ab ();
  • ac ();
  • de Anúncios();
  • }}

Resultado:

  1. Eu sou eu sou eu sou eu sou eu

Para mais informações, você pode visitar meu site

Noções básicas de código

Existem muitas diferenças, mas a principal diferença é "

delegar a responsabilidade

"

Classe abstrata

: você vai para a aula abstrata quando está em uma situação em que pode identificar a maioria dos comportamentos iguais para todos os objetos, mas existem poucos comportamentos que os tornam diferentes de outro objeto no grupo de objetos relacionados. digam Funcionário regular e Contratante, eles são todos os meios de Funcionário, portanto todas as regras de Funcionário são aplicáveis ​​a ambos. Mas o funcionário regular está em uma folha de pagamento direta, portanto, eles têm salário fixo, mas, para o contratado, cobram por horas. Esse comportamento os diferencia para que, para separar essa responsabilidade, você possa criar dois filhos do objeto Employee. Ao fazer isso, você delega parte da responsabilidade à criança (independente da preocupação), mas a maioria dos comportamentos dos pais, para que ambos possam reutilizar essa responsabilidade comum.

A classe abstrata reduz a duplicação de código. Mas aumenta o acoplamento Classe Child diretamente ligada ao pai. outro problema é que ele não adota novos comportamentos de outro ancestral, suponha que uma criança tenha comportamentos que podem ser herdados de vários pais para reduzir a duplicação de código, como nas baratas que podem voar, que podem andar e que têm os dois atributos que podem ser estendidos dos mamíferos e pássaro, mas na classe Abstract não suporta herança múltipla por causa do problema de diamante, consulte

http://javaonfly.blogspot.in/2016/03/does-java-support-multiple-inheritance.html

Interface

: É um contrato em que delega 100% de responsabilidade à classe de implementação. Quando você pode ver um grupo de objetos com alguns padrões comuns, mas a implementação de padrões é totalmente diferente, você pode agrupar esses objetos com base nos padrões / comportamentos comuns chamados interface como homem, barata, pássaro, todos podem andar, mas a maneira como o homem anda é não da mesma forma que as baratas, pois usa 4 pernas, mas todas podem andar para que você possa dizer que o padrão comum é andar para criar uma interface

Percorrivel

e se todos implementarem essa interface, agrupe todos os animais em

Percorrivel

que são capazes de andar.

Portanto, a Interface é muito poderosa, pode agrupar qualquer objeto com base em critérios comuns, manipula herança múltipla, mas delega toda responsabilidade ao filho, para que haja possibilidade de duplicação de código.

Então, pessoalmente, sou a favor de um design que use ambos e tome seus pontos fortes: você pode fazê-lo

Padrão de implementação esquelética

qual java usa para API de coleta

veja meu blog

http://javaonfly.blogspot.in/2016/09/favaor-skeletal-implementation-in-java.html

Se você gosta da minha resposta, siga meu blog para conhecer o conceito avançado de design Java.

Com o apoio de

métodos padrão

e

métodos privados

na interface desde o lançamento do Java 8 e java 9, respectivamente, a diferença entre

interface

e

resumo

classes foi reduzida, mas ainda têm grandes diferenças.

1) Herança Múltipla usando Interface

  • Uma classe abstrata não pode suportar herança múltipla, mas uma interface pode suportar herança múltipla. Assim, uma classe pode herdar várias interfaces, mas apenas uma classe abstrata.

2) Classes abstratas podem ter construtores, mas não interfaces.

3) variáveis ​​estáticas públicas finais da instância VS

  • Variáveis ​​na interface são finais estáticas públicas. Mas a classe abstrata pode ter outro tipo de variáveis ​​como private, protected etc
  • Em Java, a interface não permite declarar nenhuma variável de instância. O uso de uma variável declarada em uma interface como variável de instância retornará um erro de tempo de compilação.
  • Você pode declarar uma variável constante na interface, usando estática final, que é diferente de uma variável de instância.
  • As variáveis ​​de interface são estáticas porque as interfaces Java não podem ser instanciadas por si mesmas; o valor da variável deve ser atribuído em um contexto estático no qual nenhuma instância existe.

4) Declaração do método vs método concreto

  • Até o Java 7 e todas as versões anteriores, as interfaces eram simples. Eles só podiam conter métodos abstratos públicos. Você não pode declarar nenhum método concreto dentro da interface. Por outro lado, a classe abstrata pode conter métodos abstratos e concretos.
  • O Java 8 mudou isso. No Java 8, você pode ter métodos estáticos públicos e métodos padrão públicos. Ref: Método padrão na interface | Java8 Code Pumpkin
  • O Java 9 está adicionando métodos privados nas interfaces. Métodos particulares podem ser estáticos ou instância. Nos dois casos, o método privado não é herdado por subinterfaces ou implementações. Ref: Métodos privados na Interface | Java 9 | Code Pumpkin
  • Portanto, da perspectiva do Java 9, não podemos considerar esse ponto como uma diferença entre interface e classe abstrata.