Sombreamento de variáveis

2 respostas
D

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?

public class Xuxu extends Agua {
	int litros = 5;

	public static void main(String[] args) {
		Liquido a = new Xuxu();
		System.out.println(a.valor);
	}
}

class Agua extends Liquido {
	int litros = 10;
}

class Liquido {
	int valor = 25;
}

no caso da classe Shadows, o valor dentro do método é o que vale.

class Shadows {
	int valor = 1;

	void teste(){
		int valor = 2;
		System.out.println(valor);
	}

	public static void main(String[] args) {
		new Shadow().teste();
	}
}

2 Respostas

ribclauport

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:

Liquido a = new Xuxu();  
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:

Liquido a = new Xuxu();    
System.out.println(a.valor);  

Xuxu a = new Xuxu();    
System.out.println(a.valor);

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:
public class Teste {
   private int valor = 10;
   public void teste() {
       int valor = 15; //Escopo menor

       //Sem qualificador, vai imprimir a variável de menor escopo
       System.out.println(valor); 
       //Agora forçando a imprimir a variável de maior escopo
       System.out.println(this.valor); 
   }
}
Criado 24 de março de 2012
Ultima resposta 24 de mar. de 2012
Respostas 2
Participantes 3