Herança em Java: Uso do extends

A herança é um dos conceitos fundamentais da Programação Orientada a Objetos (POO) e permite que uma classe derive de outra, aproveitando e reutilizando seu código. Em Java, a herança é implementada com a palavra-chave extends, que indica que uma classe está herdando atributos e métodos de outra classe. A classe que herda é chamada de subclasse ou classe filha, enquanto a classe de onde as propriedades e métodos são herdados é a superclasse ou classe pai.

Conceitos Básicos

  • Superclasse (Classe Pai): É a classe que fornece métodos e atributos para outras classes herdarem.
  • Subclasse (Classe Filha): É a classe que herda métodos e atributos de uma superclasse.

Quando uma classe herda de outra, ela obtém todos os métodos e atributos não privados da superclasse. Isso ajuda a reduzir a duplicação de código e promove a reutilização.

Sintaxe de Herança

A estrutura básica da herança em Java usa a palavra-chave extends:

class Superclasse {
    // Atributos e métodos da classe pai
}

class Subclasse extends Superclasse {
    // Atributos e métodos da classe filha
}

Exemplo Prático de Herança

Vamos criar um exemplo com uma classe Animal e uma subclasse Cachorro, que herda os atributos e métodos de Animal.

Passo 1: Criar a Superclasse Animal

class Animal {
    String nome;
    int idade;

    public void comer() {
        System.out.println(nome + " está comendo.");
    }
}

Passo 2: Criar a Subclasse Cachorro

A subclasse Cachorro herda nome e idade de Animal, além do método comer.

class Cachorro extends Animal {

    public void latir() {
        System.out.println(nome + " está latindo!");
    }
}

Passo 3: Usando as Classes

Agora vamos criar uma instância da classe Cachorro e chamar métodos herdados e específicos da subclasse.

public class TesteHeranca {
    public static void main(String[] args) {
        Cachorro cachorro = new Cachorro();
        cachorro.nome = "Rex";
        cachorro.idade = 3;

        // Método herdado da classe Animal
        cachorro.comer();

        // Método específico da classe Cachorro
        cachorro.latir();
    }
}

Saída Esperada:

Rex está comendo.
Rex está latindo!

Importância da Herança

A herança permite:

  1. Reutilização de Código: A subclasse reutiliza atributos e métodos da superclasse, reduzindo a repetição.
  2. Hierarquia de Classes: Facilita a organização do código em uma estrutura hierárquica, tornando o código mais fácil de entender e gerenciar.
  3. Facilidade de Expansão: A subclasse pode ter novos atributos e métodos, adicionando funcionalidades específicas, sem modificar a superclasse.

Sobrescrita de Métodos

A sobrescrita (ou overriding) permite que a subclasse forneça uma implementação específica para um método que já está definido na superclasse. Isso é útil quando você quer que um método funcione de forma diferente em uma subclasse.

Exemplo de Sobrescrita de Método

No exemplo abaixo, vamos sobrescrever o método comer na subclasse Cachorro.

class Cachorro extends Animal {
    @Override
    public void comer() {
        System.out.println(nome + " está comendo ração.");
    }

    public void latir() {
        System.out.println(nome + " está latindo!");
    }
}

Neste caso, ao chamar o método comer na subclasse Cachorro, ele exibirá "Rex está comendo ração." em vez da mensagem da superclasse.

Conclusão

A herança é uma das técnicas mais poderosas na POO para promover a reutilização de código, a organização hierárquica e a especialização de classes. Ao dominar herança em Java, você pode criar sistemas mais flexíveis e organizados, além de economizar tempo e evitar a duplicação de código. A prática da herança, combinada com a sobrescrita de métodos, permite que suas classes evoluam para comportamentos específicos sem modificar o código da classe pai.