Java: É possível acessar elementos da Superclasse da Superclasse?
Você deve saber que para acessar um membro de uma Superclasse, nós utilizamos a palavra-chave super
. Por exemplo, super.nome
.
Mas e se nós quisermos acessar um elemento que está na Superclasse da Superclasse? Ou seja, dois níveis acima. Não podemos utilizar super.super.nome
nem super.super.super.nome
!
Isto pode ser um problema se você estiver subscrevendo métodos. Ou seja, criando um método com o mesmo nome de um método da Superclasse. Pois os métodos das classes acima da Superclasse podem se tornar inacessíveis.
Uma forma de acessar atributos de classes superiores é fazendo um cast. Por exemplo:
((Pai) this).nome
Mas isso não funciona para métodos se houver uma subscrição de método. O código abaixo acessaria o método getNome da classe filha.
((Pai) this).getNome();
Vamos ver um exemplo mais completo para percebermos esse comportamento.
Exemplo:
package br.com.dicasdejava.fundamentos;
class Avo {
String nome = "Avo";
String getNome() {
return nome;
}
}
class Pai extends Avo {
String nome = "Pai";
String getNome() {
return nome;
}
}
class Filho extends Pai {
String nome = "Filho";
String getNome() {
return nome;
}
}
class TesteOverriding {
public static void main(String[] args) {
Filho filho = new Filho();
System.out.println(filho.nome);
System.out.println(filho.getNome());
System.out.println(((Pai) filho).nome);
System.out.println(((Pai) filho).getNome());
System.out.println(((Avo) filho).nome);
System.out.println(((Avo) filho).getNome());
}
}
Saída:
Filho
Filho
Pai
Filho
Avo
Filho
Podemos observar que, ao fazermos cast do objeto homem
, nós conseguimos acessar diretamente a variável nome das classes mais acima da hierarquia. Mas o mesmo não funcionou para o método getNome()
.
O método getNome()
executado sempre foi o da classe Homem.