bom dia! estou com uma dúvida de como funciona o sombreamento de variáveis quando estou extendendo classes, no exemplo do código abaixo, quem vai determinar o valor a ser impresso é o tipo da variável de referência, mas no caso, estou criando um Xuxu, mas pensando por ordem de criação de objetos, primeiro é criado Liquido, depois Agua e depois Xuxu, logo penso que como Xuxu foi criado por último, sobrescreveria as outras duas, mas não, como funcina isto quando extendo classes?
estou criando um Xuxu, mas pensando por ordem de criação de objetos, primeiro é criado Liquido, depois Agua e depois Xuxu, logo penso que como Xuxu foi criado por último, sobrescreveria as outras duas, mas não, como funcina isto quando extendo classes?
Passei por essa dificuldade estudando para certificação, veja bem, não existe sobrescrita de variáveis de instância, ou seja, o compilador não vai “olhar” para a vesão da variável de instância do lado direito! e toda aquela coisa de polimorfismo relacionada a metodos, no seu exemplo a declaração:
Liquidoa=newXuxu();System.out.println(a.valor);
A variável de referência “a” no caso acima, é do “tipo” Liquido, sendoa assim, irá chamar o “valor” de Liquído. Ou seja no fim da conversa, a variável de referência “a” tem as variáveis de instância de “Liquido” e ponto final!
ViniGodoy
dudu795:
bom dia! estou com uma dúvida de como funciona o sombreamento de variáveis quando estou extendendo classes, no exemplo do código abaixo, quem vai determinar o valor a ser impresso é o tipo da variável de referência, mas no caso, estou criando um Xuxu, mas pensando por ordem de criação de objetos, primeiro é criado Liquido, depois Agua e depois Xuxu, logo penso que como Xuxu foi criado por último, sobrescreveria as outras duas, mas não, como funcina isto quando extendo classes?
Ele vai enxergar a variável do escopo onde ela for declarada:
Note que o shadowing não sobrescreve o valor da variável. O que ele faz é fazer com que uma variável num escopo menor "esconda" a de um escopo maior, caso seja usada sem um qualificador.
Mas ambas as variáveis ainda estão lá.
Veja um exemplo:
publicclassTeste{privateintvalor=10;publicvoidteste(){intvalor=15;//Escopo menor//Sem qualificador, vai imprimir a variável de menor escopoSystem.out.println(valor);//Agora forçando a imprimir a variável de maior escopoSystem.out.println(this.valor);}}