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
- ao usar
// 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
- 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¶
- A herança permite que uma classe herde atributos e métodos de outra classe, facilitando a reutilização de código.
- Em Java, a palavra-chave
extendsé usada para criar uma subclasse que herda de uma classe pai. - Uma classe filha pode herdar apenas os atributos, mas não os métodos da classe pai.
- Se uma classe filha sobrescrever um método da classe pai, ela deve usar a anotação
@Override. - O uso de
superem um construtor de uma classe filha chama o construtor da classe pai. - É possível acessar diretamente os membros privados de uma classe pai a partir de uma classe filha.
- 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. - Em Java, uma classe pode herdar de várias classes ao mesmo tempo (herança múltipla).
- A palavra-chave
finalpode ser aplicada a métodos, impedindo que sejam sobrescritos pelas subclasses. - Uma classe filha herda todos os construtores da classe pai.
- 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.
- Uma classe pai pode ter um construtor privado, e esse construtor não pode ser acessado diretamente por uma classe filha.
- É possível usar
superpara acessar atributos e métodos da classe pai, desde que esses membros não sejamprivate. - A palavra-chave
finalpode ser aplicada a classes, impedindo que a classe seja estendida por subclasses. - Em Java, quando uma classe filha estende uma classe pai, ela herda todos os membros
privateda classe pai.
Gabarito¶
- 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.
- Verdadeiro: a palavra-chave
extendsé usada para declarar que uma classe herda de outra. Por exemplo,class Filha extends Pai {}. - Falso: a classe filha herda tanto os atributos quanto os métodos da classe pai, a menos que sejam
privateoufinal. - Verdadeiro: a anotação
@Overrideé usada para garantir que o método da classe filha sobrescreve corretamente o método da classe pai. - 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. - Falso: membros
privatede uma classe pai não são acessíveis diretamente pelas subclasses. Para acessar, é necessário usar métodospublicouprotectedda classe pai. - 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. - 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.
- Verdadeiro: a palavra-chave
finalimpede que o método seja sobrescrito em qualquer classe filha. - 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. - 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.
- 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
protectedoupublic, ele poderá ser acessado. - Verdadeiro: a palavra-chave
superpermite acessar membros da classe pai, desde que estes não sejamprivate. Membrosprotectedoupublicpodem ser acessados diretamente. - Verdadeiro: a palavra-chave
finalpode ser usada para impedir que uma classe seja estendida por outras classes. - Falso: membros
privatenã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 sejamprotectedoupublic.