Passagem por valor e Referencia pq?

5 respostas
chcl

Galera fiz um teste aqui e observei que o java trata arrays com referencia e variaveis nao tipo como abaixo!

class Teste
{	int num = 80;
	String[] s = {"normal"};
	
               void modifyInt(int i){
		i = 5;
	}
	void modifyString(String[] s){
		s[0] = "Mudou";
	}
	public static void main(String arfs[]){
		Teste t = new Pai();
		t.modifyInt(p.num);
		System.out.println(p.num);
		p.modifyString(p.s);
		System.out.println(p.s[0]);

	}
}

OK! quando passo o array como parametro e altero o mesmo dentro do metodo seu valor real é alterado entao meu metodo tratou a referencia e nao uma copia do objeto.

Ja no inteiro (Testei com String tb e deu a mesma coisa) so a copia ou seja a variavel local do metodo é alterada e a que passei para o metodo não!
Alias string nao é primitivo e acontece a mesma coisa do inteiro entao ai que nao entendi mesmo o pq!
O que acontece com objetos trato referencia e com primitivos trato valores ?? afinal a passagem de parametros em java nao se da sempre por valor e não por referencia :?: :?: :?:

Qual o pq disso tudo :?: Alguem ai me explica :?: :?:

Valeu!

5 Respostas

danieldestro

Em passagem a passagem de parâmetros é SEMPRE por valor.

Quando você passa um array, você passa a cópia da referência do array, pois, em Java, array é um objeto.

Quando você passa um tipo primitivo, você passa a cópia do valor.

E quando você passa um objeto, você passa a cópia da referência.

Portanto se você alterar o valor de um primitivo ou a referência de um objeto, dentro de um método, isso não vale fora dele.

Porém se fizer:

public class Pessoa {
  public String nome;
}
//...
Pessoa p = new Pessoa();
p.nome = "";
alterar( p );
//...

public void alterar( Pessoa p1 ) {
  p1.nome = "Mahatma Ghandi";
}

//...

Aí sim o valor de nome de Pessoa é alterado fora do método. Pois você alterou o estado do objeto Pessoa e não a referência.

Capisce?

Diogenes

http://www.guj.com.br/forum/viewtopic.php?t=2450

chcl

Ta entendi isso ai mais como vc disse

so que nesse exemplo que coloquei acima isso acontece por isso fiquei confuso qd passo a referencia do array (membro) seu valor é alterado sim! e nao so dentro do metodo!

danieldestro

Novamente:

Como eu disse, array, em Java, é um objeto.
Se você altera algúm índice do array, vc altera o estado do array (objeto).

Faça um testes:

//...
int[ ] i = new int[5];
for(int j=0; j<i.length; j++ ) i[j] = j;
for(int j=0; j<i.length; j++ ) System.out.println( i[j] );
alterarIndice( i );
for(int j=0; j<i.length; j++ ) System.out.println( i[j] );
alterarArray( i );
for(int j=0; j<i.length; j++ ) System.out.println( i[j] );
//...

void alterarIndice( i ) {
  i[0] = 10;
  i[1] = 11;
}

void alterarArray( i ) {
  i = new int[10];
  for(int j=0; j<i.length; j++ ) i[j] = j*999;
}

Depois de chamar alterarArray() o valor dos índices do array não mudou.

chcl

Acho que deu pra sacar!

Valeu!! :!: :!: :!:

Criado 10 de março de 2004
Ultima resposta 10 de mar. de 2004
Respostas 5
Participantes 3