Pular para o conteúdo principal
Módulo 3 · Lição 1 de 25/14 no curso~12 min
Lições do módulo (1/2)

Herança

Herança é um mecanismo fundamental de OOP que permite que uma classe (chamada de classe filha ou subclasse) herde campos e métodos de outra classe (chamada de classe pai ou superclasse).

Isso promove a reutilização de código e evita repetições desnecessárias.

Estendendo uma aula com extends

Em Java, usamos a palavra-chave extends para indicar que uma classe herda de outra:

Java
class Vehicle {
    protected int speed; // 'protected' makes the field visible to subclasses

    public void honk() {
        System.out.println("Beep beep!");
    }
}

class Car extends Vehicle {
    // Car automatically inherits the speed field and the honk() method
}

O construtor e a palavra-chave super()

Se a superclasse tiver um construtor que aceita parâmetros, a subclasse deverá chamá-lo explicitamente em seu construtor usando super(...) como a primeira instrução:

Java
class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    int studentId;

    public Student(String name, int studentId) {
        super(name); // Invokes the constructor of Person
        this.studentId = studentId;
    }
}

Substituição de método (@Override)

Uma subclasse pode fornecer sua própria implementação específica para um método herdado da superclasse. Esta operação é chamada overriding (substituição de método) e é indicada pela anotação @Override.

Java
class Animal {
    public void makeSound() {
        System.out.println("Rumore generico");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miao!");
    }
}

O modificador protected

O modificador de acesso protected desempenha um papel fundamental na herança. Ao contrário de private, que torna os membros visíveis apenas dentro da mesma classe, protected permite acesso a campos e métodos dentro do mesmo pacote e por todas as subclasses, mesmo que residam em pacotes diferentes.

Acessando membros pais com super

Além de chamar o construtor da superclasse, a palavra-chave super pode ser usada em métodos de subclasse para referenciar métodos ou variáveis ​​da classe pai. Isto é particularmente útil quando um método é sobrescrito, mas você ainda deseja invocar o comportamento pai original:

Java
class Animal {
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Executes the behavior of Animal
        System.out.println("The cat purrs while sleeping.");
    }
}

Herança única em Java

Em Java, uma classe pode estender apenas uma classe (herança única). A herança direta de múltiplas classes (herança múltipla) não é permitida; por exemplo, class Cat extends Animal, Mammal causará um erro de compilação. Essa escolha de design evita ambigüidades conhecidas como “problema do diamante” (quando duas superclasses definem o mesmo método com implementações diferentes). Para superar essa limitação, Java introduz o conceito de Interfaces, que exploraremos no próximo módulo.


Experimente você mesmo

Exercício#java.m3.l1.e1
Tentativas: 0Carregando…

Complete a subclasse Dog estendendo Animal. Declare o construtor Dog que aceita um nome (String) e usa super(name) para passá-lo ao construtor Animal.

Carregando editor…
Mostrar dica

Escreva `public Dog(String nome) { super(nome); }` dentro da classe Dog.

Solução disponível após 3 tentativas

Exercício#java.m3.l1.e2
Tentativas: 0Carregando…

Estenda Dog from Animal e substitua o método makeSound() para que ele retorne a string Woof em vez de Generic Sound. Use a anotação @Override.

Carregando editor…
Mostrar dica

Escreva `@Override` acima da declaração `public String makeSound() { return 'Woof'; }` dentro do Cachorro.

Solução disponível após 3 tentativas

Exercício#java.m3.l1.e3
Tentativas: 0Carregando…

Declare uma classe Cat que estenda Animal e substitua o método makeSound() para retornar a string Meow. A classe Animal já possui um construtor que aceita um nome; certifique-se de que o construtor Cat também aceite um nome e o passe corretamente para o construtor da superclasse.

Carregando editor…
Mostrar dica

Crie a classe `Cat` estendendo `Animal`. Declare o construtor `public Cat(String name) { super(name); }` e sobrescreva o método `makeSound()` usando `@Override` para retornar `'Meow'`.

Solução disponível após 3 tentativas