Exercicio de Passagem de variaveis para métodos

7 respostas
rodolfodev

Bom, para o tópico ter mais emoção vou dividi-lo em duas partes.

Tenho dois exercicios que tirei do livro da kathy, vou coloca-los hoje para vcs pensarem e amanhã atarde coloco a minha duvida e a resposta.

Exercicio 1
class PassA {
	public static void main (String [] args){
		PassA p = new PassA();
		p.start();
	}
	void start(){
		long[] a1 = {3,4,5};
		long[] a2 = fix(a1);
		System.out.println(a1[0] + a1[1] + a1[2] + " ");
		System.out.println(a2[0] + a2[1] + a2[2]);
	}
	
	long [] fix(long [] a1){
		a1[1] = 7;
		return a1;
	}
}
Exercicio 2
class Test {
	public static void main (String [] args){
		Test t = new Test();
		t.start();
	}
	void start(){
		boolean b1 = false;
		boolean b2 = fix(b1);
		System.out.println(b1 + " " + b2);
	}
	
	boolean fix(boolean b1){
		b1 = true;
		return b1;
	}
}

7 Respostas

davidbuzatto

O q ta virando isso aqui… É só o q tava faltando… Tópico à prestações…

rodolfodev

Atendendo a pedidos acho q isso parece meio palhaçada.

Então minha duvida é.

Para mim os dois exercicios deveriam ter comportamento iguais, mais no exercicio 1 todos os arrays tem a mesma referencia de a1 e o resultado é 15 e 15. Já no exercicio 2 os boolean tem a mesma referência mais a respota não é igual b1 é diferente de b2, [resposta false true].

Queria saber se alguem consegue me explicar oq acontece.

Valeu e desculpa pela enrolação é q o resultado eu já sei mais o porque ainda estou me convencendo. rs

Grato,

Rodolfo

diego2005

As variáveis do primeiro exercício são arrays, por isso todos tem a mesma referência, ou seja, o mesmo conteúdo, ele “apontam” endereço na memória (Java is not C++). Já no segunda exercício, as outras variáveis tem apenas uma cópia do valor de b1, e não a mesma referência.

Não sei se fui claro, e nem correto, mas se alguém puder te explicar melhor…

Falow…T+

Luiz_Gustavo

Em java, a passagem de parâmetros é por valor, independentemente se o que é passado para um método é um objeto ou um tipo primitivo.

Quando você passa um tipo primitivo para um método, você está na verdade passando uma cópia do seu valor:

...
boolean bOut = true;
muda(bOut);
System.out.println(bOut);

...

public void muda(boolean bIn){

   bIn = !bIn;
}

o resultado apresentado será true, pois o método muda(boolean bIn) opera sobre uma cópia do valor passado, e não no valor do atributo passado como parâmetro, ou seja, o valor de bOut não é afetado pela mudança em bIn.

Quando você passa um objeto a um método acontece o mesmo. Você está passando na verdade uma cópia do endereço deste objeto na memória.

...
long objOut[] = {1, 2, 3};
muda(objOut);
System.out.println(objOut[0] + objOut[1] + objOut[2] + "");

...

public void muda(long[] objIn){

   objIn[1] = 7;
}

como um array é um objeto, quando você passao o array ao método, é passado o endereço do mesmo. Lá dentro do método, a operação ocorre exatamente no objeto array que possui aquele endereço (que nesse ponto possui duas variáveis que apontam para o mesmo endereço, objOut e objIn, logo para o mesmo objeto).

Quando duas variáveis de instância possuem o mesmo endereço, ou seja, apontam para o mesmo objeto, qualquer uma delas pode alterar um valor do objeto. Veja bem, um valor do objeto, não o próprio objeto. O que isso quer dizer?

quer dizer que se no método muda(long[] objIn) a operação fosse essa:

public void muda(long[] objIn){
		
     objIn = new long[]{5, 5, 5};
}

você não teria o objeto objOut alterado para um novo objeto, e sua saída seria 6, pois neste caso o que está sendo feito é atribuir um novo objeto à variável de instância objIn, mas não à variável de instância objOut.

sacou?

ahhh… para exemplificar, me veio a seguinte comparação à mente:

Imagine que você tenha (não me pergunte o por quê) duas pessoas soltando a mesma pipa, ou seja, duas linhas amarradas à mesma pipa.
Se qualquer uma dessas pessoas puxar a pipa para um lado e para o outro, a outra pessoa vai perceber, e vice-versa. Esse seria o caso da mudança no valor, que é percebido pelas duas instâncias.
Agora, se uma das duas, de saco cheio de dividir a mesma pipa, resolve cortar a sua linha e amarrar em outra pipa, a outra pessoa continua com a pipa na linha… enquanto a outra tem sua própria pipa… sacou?

bom, espero ter ajudado a esclarecer!

[]s

rodolfodev

no exercicio 2 na linha

boolean b2 = fix(b1);

o b1 é uma copia não uma referência do b1 por isso que b1 continua false?

Luiz_Gustavo

rodolfodev:
no exercicio 2 na linha

boolean b2 = fix(b1);

o b1 é uma copia não uma referência do b1 por isso que b1 continua false?

na verdade o que vai “para dentro” do método é que é uma cópia…
então o método trabalha com uma cópia do valor de b1, e te retorna o resultado para b2…

[]'s

rodolfodev

Beleza entendi. Vou procurar mais uns exercicios desses, porque apesar de parecer simples esse tipo de exercicio confunde.

Grato,

Criado 26 de junho de 2006
Ultima resposta 27 de jun. de 2006
Respostas 7
Participantes 4