Skip to content

Herança

Introdução

  • Herança = permite criar novas classes a partir de classes existentes, reutilizando e estendendo funcionalidades
    • A herança facilita a reutilização de código e a organização hierárquica, criando uma relação de especialização entre classes
    • conceito central da Programação Orientada a Objetos - um dos pilares
  • a herança permite que uma classe herde atributos e métodos de outra, chamada de classe "superclasse" / "mãe" / "pai"
  • e classe que herda é chamada de subclasse ou "classe filha"
  • efeitos da herança
    • elimina a duplicação de código
    • promove reutilização
    • facilita a manutenção - alterações na superclasse podem beneficiar todas as subclasses
  • a herança é essencial para criar hierarquias de classes, permitindo o reaproveitamento e especialização do código de forma organizada

  • superclasse / progenitora / mãe / pai = a classe base da qual outra classe herda

    • contém atributos e métodos genéricos que podem ser compartilhados por várias subclasses
  • subclasse / filha = é a classe que herda a superclasse
    • pode adicionar novos métodos e atributos
    • pode sobrescrever (modificar) métodos herdados
  • palavra-Chave extends = usada para definir que uma classe é uma subclasse de outra.
    • ao usar extends, a subclasse herda automaticamente todos os atributos e métodos públicos e protegidos da superclasse
// superclasse
public class Animal {
    public void comer() {
        System.out.println("O animal está comendo");
    }
}

// subclasse
public class Cachorro extends Animal {
    // herda o método `comer()` da superclasse `Animal` 
    // adiciona o método específico `latir()`
    public void latir() {
        System.out.println("O cachorro está latindo");
    }
}
// superclasse
public class Veiculo {
    protected String marca;

    public void buzinar() {
        System.out.println("Buzina do veículo!");
    }
}

// subclasse que herda de Veiculo
public class Carro extends Veiculo {
    private int portas;

    public Carro(String marca, int portas) {
        this.marca = marca;
        this.portas = portas;
    }

    public void exibirDetalhes() {
        System.out.println("Marca: " + marca + ", Portas: " + portas);
    }
}

Construtores com herança - super

  • o construtor de uma subclasse pode chamar o construtor da superclasse usando a palavra-chave super
  • isso é necessário para inicializar atributos herdados ou para configurar corretamente a parte da superclasse do objeto
  • uso de super
    • deve ser a primeira linha no construtor da subclasse
    • pode ser usado para acessar métodos e atributos da superclasse que foram sobrescritos
// superclasse
public class Animal {
    protected String nome;

    // construtor da superclasse
    public Animal(String nome) {
        this.nome = nome;
    }
}

// subclasse que usa super
public class Gato extends Animal {
    private String raca;

    // construtor da subclasse
    public Gato(String nome, String raca) {
        super(nome); // Chama o construtor da superclasse
        this.raca = raca;
    }

    public void exibirDetalhes() {
        System.out.println("Nome: " + nome + ", Raça: " + raca);
    }
}

Restrição de herança e sobrescrita - final

  • classe final = não pode ser estendida - isto é, não pode ter subclasses
    • útil quando se deseja garantir que uma classe não será modificada
public final class Calculadora {
    // Código da classe
}
  • método final = não pode ser sobrescrito por subclasses
    • uso = proteger a implementação de métodos críticos ou que não devem ser alterados
public class Animal {
    public final void dormir() {
        System.out.println("O animal está dormindo");
    }
}
  • variável final = quando aplicada a atributos, torna o valor constante - não pode ser alterado após a inicialização

Exercícios

Questões

  1. A herança permite que uma classe herde atributos e métodos de outra classe, facilitando a reutilização de código.
  2. Em Java, a palavra-chave extends é usada para criar uma subclasse que herda de uma classe pai.
  3. Uma classe filha pode herdar apenas os atributos, mas não os métodos da classe pai.
  4. Se uma classe filha sobrescrever um método da classe pai, ela deve usar a anotação @Override.
  5. O uso de super em um construtor de uma classe filha chama o construtor da classe pai.
  6. É possível acessar diretamente os membros privados de uma classe pai a partir de uma classe filha.
  7. Uma classe filha pode sobrescrever um método da classe pai e, ao mesmo tempo, chamar o método original da classe pai utilizando a palavra-chave super.
  8. Em Java, uma classe pode herdar de várias classes ao mesmo tempo (herança múltipla).
  9. A palavra-chave final pode ser aplicada a métodos, impedindo que sejam sobrescritos pelas subclasses.
  10. Uma classe filha herda todos os construtores da classe pai.
  11. Em Java, quando uma classe filha sobrescreve um método da classe pai, o método sobrescrito deve ter o mesmo tipo de retorno e a mesma lista de parâmetros.
  12. Uma classe pai pode ter um construtor privado, e esse construtor não pode ser acessado diretamente por uma classe filha.
  13. É possível usar super para acessar atributos e métodos da classe pai, desde que esses membros não sejam private.
  14. A palavra-chave final pode ser aplicada a classes, impedindo que a classe seja estendida por subclasses.
  15. Em Java, quando uma classe filha estende uma classe pai, ela herda todos os membros private da classe pai.

Gabarito

  1. Verdadeiro: a herança permite a reutilização de código, pois a classe filha pode herdar os atributos e métodos da classe pai, evitando duplicação de código.
  2. Verdadeiro: a palavra-chave extends é usada para declarar que uma classe herda de outra. Por exemplo, class Filha extends Pai {}.
  3. Falso: a classe filha herda tanto os atributos quanto os métodos da classe pai, a menos que sejam private ou final.
  4. Verdadeiro: a anotação @Override é usada para garantir que o método da classe filha sobrescreve corretamente o método da classe pai.
  5. Verdadeiro: a palavra-chave super é usada no construtor da classe filha para invocar o construtor da classe pai, permitindo a inicialização dos atributos herdados.
  6. Falso: membros private de uma classe pai não são acessíveis diretamente pelas subclasses. Para acessar, é necessário usar métodos public ou protected da classe pai.
  7. Verdadeiro: uma classe filha pode sobrescrever um método da classe pai e, ao mesmo tempo, invocar a versão original do método com super.
  8. Falso: Java não suporta herança múltipla de classes. Uma classe pode herdar de apenas uma classe direta, mas pode implementar várias interfaces.
  9. Verdadeiro: a palavra-chave final impede que o método seja sobrescrito em qualquer classe filha.
  10. Falso: a classe filha não herda os construtores da classe pai. A menos que um construtor específico seja chamado com super, o construtor padrão da classe pai (se existir) será invocado automaticamente.
  11. Verdadeiro: ao sobrescrever um método, o tipo de retorno e os parâmetros devem ser exatamente os mesmos para garantir que a assinatura do método seja compatível.
  12. Verdadeiro: se um construtor da classe pai for privado, ele não poderá ser acessado diretamente pela classe filha. Contudo, se o construtor da classe pai for protected ou public, ele poderá ser acessado.
  13. Verdadeiro: a palavra-chave super permite acessar membros da classe pai, desde que estes não sejam private. Membros protected ou public podem ser acessados diretamente.
  14. Verdadeiro: a palavra-chave final pode ser usada para impedir que uma classe seja estendida por outras classes.
  15. Falso: membros private não são herdados pelas subclasses, mesmo que a classe filha estenda a classe pai. Para acesso, é necessário que os membros da classe pai sejam protected ou public.