Referência objeto Sombreada

5 respostas
dfsilva86

Pessoal,

No livro da Kathy tem o seguinte código, no qual está comentada minha dúvida.
Estava lendo sobre sombreamento de variáveis...tudo maravilha até chegar nisso aqui que embolou minha cabeça :lol:

public class Bar {

	int barNum = 28;
}
public class Foo {

	Bar myBar = new Bar();

	void changeIt(Bar myBar) {
		
		myBar.barNum = 99;
		System.out.println("myBar.barNum in changeIt is " + myBar.barNum);

		myBar = new Bar(); 
		myBar.barNum = 420; //Como o compilador sabe que é o objeto myBar criado anteriormente?

		System.out.println("myBar.barNum in changeIt is now " + myBar.barNum);
	}

	public static void main(String[] args) {

		Foo f = new Foo();
		System.out.println("f.myBar.barNum is " + f.myBar.barNum);

		f.changeIt(f.myBar);

		System.out.println("myBar.barNum after changeIt is " + f.myBar.barNum);
	}
}

Saída:

f.myBar.barNum is 28
myBar.barNum in changeIt is 99
myBar.barNum in changeIt is now 420
myBar.barNum after changeIt is 99

5 Respostas

escobardo

Acompanhe este raciocínio e ve se consegue entender :slight_smile: :

Primeiro imprime 28;

Na chamada da linha 21, o endereço de memória do foo.myBar é passada no parametro do método;

Na linha 7 esse objeto é alterado (foo.myBar tem uma referencia para ele) para o valor 99;

Na linha 10 o parametro fica nulo mas o foo.myBar do main() ainda mantém a referência;

Imprime 420;

Imprime 99 pois o objeto referenciado por foo.myBar foi alterado na linha 7;

abraço

fantomas

Eu já acho que é por causa do escopo (visibilidade) dos atributos/variáveis.

flws

lipe82

Bom exemplo cara, teria errado se fosse no teste hoje!
Preciso estudar

O lance é que na linha 10 foi criada uma nova instancia para a variável myBar e ela foi mudada de valor. Porém qd ela é passada pelo método ela só é passada por referencia, por isso é a mesma, referência.

dfsilva86

Isso…lendo as respostas e relendo o livro consegui entender, realmente isso confunde!!!

M

Só para corrigir…O java não passa por referência, mas sim uma cópia da referência…
é por isso que quando foi mudando a referencia na linha 10 ( myBar = new Bar(); ), não influenciou fora do método.

Ats,
Marcelo

Criado 9 de fevereiro de 2009
Ultima resposta 11 de fev. de 2009
Respostas 5
Participantes 5