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.