Use abstract classes and interfaces

Em Java, abstract classes e interfaces são recursos importantes para facilitar a implementação de herança e polimorfismo. Vou fornecer exemplos de como usar abstract classes e interfaces.

Abstract Classes:

Uma classe abstrata é uma classe que não pode ser instanciada diretamente e geralmente contém métodos abstratos (métodos sem implementação) que devem ser implementados pelas subclasses. Aqui está um exemplo:

// Classe abstrata
abstract class Animal {
    String nome;

    Animal(String nome) {
        this.nome = nome;
    }

    // Método abstrato (sem implementação)
    abstract void fazerSom();

    void dormir() {
        System.out.println(nome + " está dormindo.");
    }
}

// Subclasse que estende a classe abstrata
class Cachorro extends Animal {
    Cachorro(String nome) {
        super(nome);
    }

    // Implementação do método abstrato
    @Override
    void fazerSom() {
        System.out.println(nome + " faz: Au Au!");
    }
}

public class ExemploAbstractClass {
    public static void main(String[] args) {
        Cachorro cachorro = new Cachorro("Bolt");
        cachorro.fazerSom(); // Chamando método implementado na subclasse
        cachorro.dormir();   // Chamando método da superclasse
    }
}

Interfaces:

Uma interface em Java define um conjunto de métodos abstratos que as classes que a implementam devem fornecer. Interfaces podem ser implementadas por várias classes. Aqui está um exemplo:

// Interface
interface Veiculo {
    void acelerar();
    void frear();
}

// Classes que implementam a interface
class Carro implements Veiculo {
    @Override
    public void acelerar() {
        System.out.println("Carro acelerando.");
    }

    @Override
    public void frear() {
        System.out.println("Carro freando.");
    }
}

class Bicicleta implements Veiculo {
    @Override
    public void acelerar() {
        System.out.println("Bicicleta pedalando mais rápido.");
    }

    @Override
    public void frear() {
        System.out.println("Bicicleta freando.");
    }
}

public class ExemploInterface {
    public static void main(String[] args) {
        Carro carro = new Carro();
        Bicicleta bicicleta = new Bicicleta();

        // Chamando métodos da interface
        carro.acelerar();
        carro.frear();

        bicicleta.acelerar();
        bicicleta.frear();
    }
}

Neste exemplo, a interface Veiculo define métodos acelerar e frear. As classes Carro e Bicicleta implementam essa interface, fornecendo implementações específicas para esses métodos.

Ambos, abstract classes e interfaces, são ferramentas poderosas na construção de hierarquias de classes e promovem a reutilização de código. A escolha entre uma classe abstrata e uma interface depende da situação específica e dos requisitos do design. Em geral, prefira interfaces quando desejar fornecer uma estrutura comum a várias classes não relacionadas por herança direta.