13.4. Herança e Polimorfismo em Java: Uso de 'super' para acessar membros da superclasse
Página 88 | Ouça em áudio
13.4 Herança e Polimorfismo em Java: Uso de 'super' para Acessar Membros da Superclasse
A herança é um dos pilares fundamentais da Programação Orientada a Objetos (POO), e Java, sendo uma linguagem que adota esse paradigma, oferece mecanismos robustos para implementá-la. Herança permite que uma classe herde características de outra classe, promovendo a reutilização de código e a criação de uma hierarquia de classes. O polimorfismo, por sua vez, é a capacidade de um objeto ser referenciado de várias formas, principalmente através de sua classe base ou interfaces. Ambos os conceitos são essenciais para a compreensão e o desenvolvimento eficiente de aplicações em Java.
Quando uma classe herda de outra, a classe que herda é chamada de subclasse, enquanto a classe da qual ela herda é chamada de superclasse. A subclasse herda campos e métodos da superclasse, podendo também adicionar novos campos e métodos ou sobrescrever os métodos herdados. No entanto, pode haver situações em que a subclasse deseja acessar os membros (campos ou métodos) da superclasse. É aqui que o uso da palavra-chave super
se torna relevante.
Acessando Membros da Superclasse com 'super'
A palavra-chave super
em Java é usada dentro de uma subclasse e serve para fazer referência direta à superclasse imediata. Ela é usada principalmente em três situações:
- Para chamar o construtor da superclasse.
- Para acessar um membro da superclasse que foi ocultado pela subclasse (por exemplo, um campo com o mesmo nome).
- Para invocar um método da superclasse que foi sobrescrito pela subclasse.
Chamando o Construtor da Superclasse
Quando uma subclasse é instanciada, o construtor da superclasse é chamado antes do construtor da subclasse. Se a superclasse não tiver um construtor sem argumentos (ou seja, um construtor padrão), você precisará chamar explicitamente um construtor específico da superclasse usando super
. Isso é feito na primeira linha do construtor da subclasse:
class Base {
Base(int x) {
System.out.println("Construtor da Base com valor " + x);
}
}
class Derivada extends Base {
Derivada(int x, int y) {
super(x); // Chama o construtor da classe Base
System.out.println("Construtor da Derivada com valor " + y);
}
}
Acessando Membros Ocultos da Superclasse
Se uma subclasse define um campo com o mesmo nome de um campo da superclasse, o campo da superclasse é ocultado dentro da subclasse. Para acessar o campo ocultado da superclasse, você pode usar super
:
class Base {
int numero;
}
class Derivada extends Base {
int numero;
void setNumero(int numero) {
this.numero = numero; // Atribui ao campo da subclasse
super.numero = numero + 10; // Atribui ao campo da superclasse
}
}
Invocando Métodos Sobrescritos da Superclasse
Quando uma subclasse sobrescreve um método da superclasse, ela pode ainda chamar a versão do método da superclasse usando super
. Isso é útil quando você deseja estender a funcionalidade do método sobrescrito, em vez de substituí-lo completamente:
class Base {
void mostrar() {
System.out.println("Mostrar da Base");
}
}
class Derivada extends Base {
void mostrar() {
super.mostrar(); // Chama o método mostrar() da superclasse
System.out.println("Mostrar da Derivada");
}
}
Polimorfismo e Herança
O polimorfismo em Java é intimamente relacionado com a herança. Através do polimorfismo, objetos de uma subclasse podem ser tratados como objetos da superclasse. Isso permite que métodos ou variáveis de referência da superclasse sejam usados para referenciar objetos de qualquer subclasse, possibilitando a execução de métodos sobrescritos específicos da subclasse. A decisão sobre qual método invocar é feita em tempo de execução (late binding), o que é conhecido como polimorfismo de tempo de execução ou polimorfismo dinâmico.
Por exemplo, considere uma superclasse chamada Animal
e subclasses Cachorro
e Gato
. Se ambas as subclasses sobrescrevem um método fazerSom()
da superclasse, um método que recebe uma referência de Animal
pode invocar fazerSom()
e o som apropriado será produzido, dependendo se o objeto referenciado é um Cachorro
ou um Gato
.
class Animal {
void fazerSom() {
System.out.println("Som genérico de animal");
}
}
class Cachorro extends Animal {
void fazerSom() {
System.out.println("Au au");
}
}
class Gato extends Animal {
void fazerSom() {
System.out.println("Miau");
}
}
public class TestePolimorfismo {
public static void main(String[] args) {
Animal meuAnimal = new Cachorro();
meuAnimal.fazerSom(); // Produzirá "Au au"
meuAnimal = new Gato();
meuAnimal.fazerSom(); // Produzirá "Miau"
}
}
Este exemplo ilustra a flexibilidade e a potência do polimorfismo em Java, onde a implementação específica de um método é determinada pelo tipo real do objeto e não pelo tipo da variável de referência.
Conclusão
Herança e polimorfismo são conceitos chave na programação orientada a objetos e são amplamente utilizados em Java para criar programas flexíveis e reutilizáveis. A palavra-chave super
desempenha um papel importante na herança, permitindo que as subclasses interajam com membros da superclasse de maneira controlada. O polimorfismo, por outro lado, permite a interação com objetos de diferentes classes através de uma interface comum. Compreender esses conceitos e saber como aplicá-los é fundamental para qualquer programador Java que deseja criar sistemas robustos e manuteníveis.
Agora responda o exercício sobre o conteúdo:
Qual das seguintes afirmações sobre a palavra-chave `super` em Java está correta?
Você acertou! Parabéns, agora siga para a próxima página
Você errou! Tente novamente.
Próxima página do Ebook Gratuito: