Classe abstrata vs interface em Java – diferença entre elas

Diferença chave entre classe abstrata e interface em Java

  • Na Interface, uma classe pode implementar múltiplas interfaces, enquanto a classe pode herdar apenas uma Classe Abstrata.
  • In Interface não possui modificadores de acesso. Presume-se que tudo definido dentro da Interface tenha um modificador público, enquanto a Classe Abstrata pode ter um modificador de acesso.
  • A Interface não pode conter campos de dados, enquanto a classe abstrata pode ter campos de dados.
  • As interfaces ajudam a definir as habilidades periféricas de uma classe, enquanto uma classe abstrata define a identidade de uma classe.

Interface vs Classe Abstrata em Java

O que é classe abstrata?

Uma classe que possui a palavra-chave abstract em sua declaração é chamada de classe abstrata. Classes abstratas devem ter zero ou mais métodos abstratos. ou seja, métodos sem corpo. Pode ter vários métodos concretos.

As classes abstratas permitem criar modelos para classes concretas. Mas a classe herdeira deve implementar o método abstrato.

Classes abstratas não podem ser instanciadas.

Razões importantes para usar interfaces

  • Interfaces são usadas para alcançar abstração.
  • Projetado para suportar resolução de métodos dinâmicos em tempo de execução
  • Isso ajuda você a obter um acoplamento fraco.
  • Permite separar a definição de um método da hierarquia de herança

Razões importantes para usar classe abstrata

  • Classes abstratas oferecem funcionalidade padrão para as subclasses.
  • Fornece um modelo para futuras aulas específicas
  • Ajuda você a definir uma interface comum para suas subclasses
  • A classe abstrata permite a reutilização do código.

O que é Interface?

A interface é um modelo que pode ser usado para implementar uma classe. A interface não contém nenhum método concreto (métodos que possuem código). Todos os métodos de uma interface são métodos abstratos.

Uma interface não pode ser instanciada. Entretanto, classes que implementam interfaces podem ser instanciadas. As interfaces nunca contêm variáveis ​​de instância, mas podem conter variáveis ​​finais estáticas públicas (ou seja, variáveis ​​de classe constantes)

Diferença entre Interface e Classe Abstrata em Java

Uma classe abstrata permite que você crie funcionalidades que as subclasses podem implementar ou substituir, enquanto uma interface permite apenas declarar a funcionalidade, mas não implementá-la. Uma classe pode estender apenas uma classe abstrata, enquanto uma classe pode implementar múltiplas interfaces.

parâmetros Interface Aula abstrata
Velocidade Devagar pomposidade
Múltiplas Heranças Implementar várias interfaces Apenas uma classe abstrata
Estrutura Métodos abstratos Métodos abstratos e concretos
Quando usar Aprimoramento futuro Para evitar a independência
Herança/Implementação Uma classe pode implementar múltiplas interfaces A classe pode herdar apenas uma classe abstrata
Implementação Padrão Ao adicionar coisas novas à interface, é um pesadelo encontrar todos os implementadores e implementar coisas recém-definidas. No caso de classe abstrata, você pode aproveitar as vantagens da implementação padrão.
Modificadores de acesso A interface não possui modificadores de acesso. Tudo definido dentro da interface é assumido como modificador público. A classe abstrata pode ter um modificador de acesso.
Quando usar É melhor usar interface quando várias implementações compartilham apenas assinatura de método. Hierarquia polimórfica de tipos de valor. Deve ser usado quando várias implementações do mesmo tipo compartilham um comportamento comum.
Campos de dados a interface não pode conter campos de dados. a classe pode ter campos de dados.
Padrão de herança múltipla Uma classe pode implementar inúmeras interfaces. Uma classe herda apenas uma classe abstrata.
Implementação Uma interface é abstrata, portanto não pode fornecer nenhum código. Uma classe abstrata pode fornecer código padrão completo que deve ser substituído.
Uso de modificadores de acesso Você não pode usar modificadores de acesso para métodos, propriedades, etc. Você pode usar uma classe abstrata que contenha modificadores de acesso.
Uso As interfaces ajudam a definir as habilidades periféricas de uma classe. Uma classe abstrata define a identidade de uma classe.
Campos definidos Nenhum campo pode ser definido Uma classe abstrata permite definir campos e constantes
Herança Uma interface pode herdar múltiplas interfaces, mas não pode herdar uma classe. Uma classe abstrata pode herdar uma classe e múltiplas interfaces.
Construtor ou destruidores Uma interface não pode declarar construtores ou destruidores. Uma classe abstrata pode declarar construtores e destruidores.
Limite de Extensões Ele pode estender qualquer número de interfaces. Ele pode estender apenas uma classe ou uma classe abstrata por vez.
Palavra-chave abstrata Em uma palavra-chave de interface abstrata, é opcional declarar um método como abstrato. Em uma classe abstrata, a palavra-chave abstract é obrigatória para declarar um método como abstrato.
Tipo de aula Uma interface pode ter apenas métodos abstratos públicos. Uma classe abstrata possui métodos abstratos protegidos e públicos.

Código de exemplo para interface e classe abstrata em Java

Following é um código de exemplo para criar uma interface e uma classe abstrata em Java

Sintaxe da interface

interface name{
//methods
}

Exemplo de interface Java:

interface Pet {
    public void test();
}
class Dog implements Pet {
    public void test() {
        System.out.println("Interface Method Implemented");
    }
    public static void main(String args[]) {
        Pet p = new Dog();
        p.test();
    }
}

Sintaxe de classe abstrata

abstract class name{
    // code
}

Exemplo de classe abstrata:

abstract class Shape {
    int b = 20;
    abstract public void calculateArea();
}

public class Rectangle extends Shape {
    public static void main(String args[]) {
        Rectangle obj = new Rectangle();
        obj.b = 200;
        obj.calculateArea();
    }
    public void calculateArea() {
        System.out.println("Area is " + (b * b));
    }
}