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:
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:
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.
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:
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
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.
Mostrar dica
Escreva `public Dog(String nome) { super(nome); }` dentro da classe Dog.
Solução disponível após 3 tentativas
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.
Mostrar dica
Escreva `@Override` acima da declaração `public String makeSound() { return 'Woof'; }` dentro do Cachorro.
Solução disponível após 3 tentativas
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.
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