Classe abstrata vs. Interface em Java: Explicação com Exemplos

Classes abstratas e interfaces são usadas para abstração em Java. A abstração na programação orientada a objetos refere-se à ocultação dos detalhes de implementação dos usuários finais.

Na abstração, você pode saber quais são as funcionalidades, mas não pode saber como elas foram implementadas.

Vamos olhar para cada um deles e tentar entender por que eles são usados.

Classe Abstrata

Uma classe que não pode ser instanciada como um objeto e pode ou não ter métodos abstratos é chamada de classe abstrata em Java. Um método abstrato é um método que não possui um corpo de implementação quando declarado.

Exemplo de uma classe abstrata GraphicObject – Oracle

Você pode criar uma classe abstrata especificando a palavra-chave abstract antes da palavra-chave class.

abstract class abstractClass {
    void run() {
        System.out.println("ran");
    }
}

Uma classe abstrata pode ser estendida por outras classes. Em outras palavras, também pode ser subclassificado.

abstract class AbstractClass {
    void run() {
        System.out.println("ran");
    }
}

class ExtendingAbstractClass extends AbstractClass {
    void newMethod() {
        System.out.println("new");
    }

    @Override
    void run() {
        System.out.println("override");
    }
}

Classes abstratas são usadas para implementar métodos comuns entre várias classes que estendem uma determinada classe abstrata. Além disso, a capacidade de definir métodos abstratos dentro de classes abstratas os torna incrivelmente úteis para classes que possuem métodos semelhantes, mas com implementações diferentes. Vamos dar um exemplo.

  Como fazer Análise Exploratória de Dados (EDA) em R (com exemplos)

Considere um carro que possui algumas funcionalidades, como partida, parada, ré, etc. Essas funcionalidades são comuns a todos os tipos de carros.

Mas e quanto às funcionalidades de automação, como a direção autônoma? A implementação dessas funcionalidades pode diferir para diferentes tipos de carros. Vamos ver como você pode criar um programa orientado a objetos relacionado a ele.

Em primeiro lugar, crie uma classe Car que será estendida por várias classes de diferentes tipos de carros.

abstract class Car {
    void start() {
        // implementation
        System.out.println("runs car");
    }

    void stop() {
        // implementation
        System.out.println("engine stops");
    }

    void reverse() {
        // implementation
        System.out.println("reverse mode enabled");
    }

    abstract void selfDrive();
}

Os métodos start(), stop() e reverse() são métodos comuns em todos os carros. Portanto, sua implementação já está definida dentro da própria classe Car. No entanto, um determinado tipo de carro pode ter diferentes implementações do modo autônomo. E assim, você pode definir selfDrive() como um método abstrato e implementá-lo de diferentes maneiras em diferentes classes de diferentes tipos de carros.

class CarTypeA extends Car {
    @Override
    void start() {
        super.start();
    }

    @Override
    void stop() {
        super.stop();
    }

    @Override
    void reverse() {
        super.reverse();
    }

    void selfDrive() {
        // custom implementation
        System.out.println("Type A self driving mode enabled");
    }
}
class CarTypeB extends Car {
    // ...all similar methods

    void selfDrive() {
        // custom implementation
        // different implementation than CarTypeB
        System.out.println("Type B self driving mode enabled");
    }
}

É importante observar que, se uma subclasse não implementa todos os métodos abstratos definidos na classe abstrata, ela deve ser declarada como uma classe abstrata.

  Como adicionar, usar e personalizar widgets no seu iPhone

Interface

Uma interface é uma maneira de dizer a uma classe quais métodos devem ser implementados por ela. Por exemplo, se você considerar o exemplo de um carro, ele tem algumas funções básicas. Ele pode começar, mover e parar. Estas funções são comuns em todos os carros.

Portanto, se você implementar uma interface de um carro em uma classe, deverá implementar todos os métodos para que o carro funcione corretamente e com segurança.

Semelhante às classes abstratas, não podemos instanciar ou criar objetos de uma interface. Ela pode ser considerada uma classe totalmente abstrata porque contém apenas métodos abstratos, ou seja, métodos sem um corpo de implementação.

Você pode criar uma interface usando a palavra-chave interface.

interface CAR {
    void start();
    void stop();
    void move();
}

Implemente uma interface usando a palavra-chave implements ao definir uma classe.

class CarTypeB implements CAR {
    public void start() {
        System.out.println("started");
    }

    public void stop() {
        System.out.println("stopped");
    }

    public void move() {
        System.out.println("running");
    }
}

Semelhança

Nenhuma instanciação como um objeto é a única coisa que classes abstratas e interfaces têm em comum.

Diferenças

Herança e implementação de interface de classe abstrataApenas uma classe abstrata pode ser herdada por uma classe.Múltiplas interfaces podem ser implementadas por uma classe.Tipos de variáveisPode ter variáveis ​​finais, não finais, estáticas e não estáticas.Pode ter apenas variáveis ​​estáticas e finais. Tipos de métodos Pode conter métodos abstratos e não abstratos. Pode conter apenas métodos abstratos, mas métodos estáticos são uma exceção. Modificadores de acesso Uma classe abstrata pode ter um modificador de acesso. As assinaturas de método definidas na interface são públicas por padrão. Uma interface não tem um modificador de acesso.Construtores e DestruidoresEle pode declarar construtores e destruidores.Não pode declarar construtores ou destruidores.VelocidadeFastSlowDiferenças entre classe abstrata e interface

  O que significam as luzes no estojo dos AirPods?

Quando usar classe abstrata e interface?

Use classes abstratas quando:

  • Você deseja compartilhar alguns métodos e campos comuns entre várias classes.
  • Declarar campos não estáticos e não finais para modificar o estado do objeto ao qual estão vinculados.

Você pode usar interfaces quando:

  • Você deseja definir o comportamento de uma classe que implementa a interface, mas não se importa com a maneira como ela é implementada.
  • Você quer ter certeza de que uma classe implementa todos os métodos para funcionar corretamente.

Palavras Finais

As interfaces são usadas principalmente para criar APIs porque podem fornecer uma estrutura para implementar a funcionalidade sem se preocupar com a implementação real.

As classes abstratas geralmente são usadas para compartilhar métodos abstratos e não abstratos comuns entre várias classes, que estendem a classe abstrata para tornar o código mais reutilizável.

Aprenda mais sobre Java com a ajuda destes cursos online para java. Você está se preparando para uma entrevista em Java? Aqui estão algumas perguntas da entrevista sobre Programação Orientada a Objetos.