Passagem de parâmetro por referência

vcs concordam se eu disser q em Java n existe passagem de parametros por referência?

Olá, bem vindo.

http://www.guj.com.br/posts/list/24894.java
http://www.guj.com.br/posts/list/19722.java

JAVA tem passagem de parâmetros por valor e por referencia.

Concordo com th13fp45s.

No livro de certificaçao da Kaatie Sierra e do Bates eles afirmam isto categoricamente ! O que se passa é uma cópia do enddreço do objeto, que pode ter seu conteúdo alterado pelo método.

Você pode nos dizer seu nome ?

Márcio

oi, meu nome eh Alexandre Muzzio, no livro Core Java tbm isso eh afirmado categoricamente, e eu concordo, pois eh criado uma nova referencia para o objeto, q essa nova referencia pode mudar o estado atual do objeto, mas no fim do metodo, ela deixa de existir…

Alexandre,

Já li num livro sobre RMI que há passagem por referência, mas acho estranho. Vou procurar este livro e procurar saber se o autor não está falando besteira,

Abraços,

Márcio

tem q ver… mas ficaria meio estranho em um local existir passagem por referencia e em outro na mesma linguagem n existir…

os cara fala que nao existe passagem por referencia mas se isso aqui nao é por referencia entao nao sei mais o que é passagem por referencia:

public class Classe1{
   int valor;
   String nome;
   public Classe1(){
      valor = 0;
      nome = "ninguem";
   }
}


public class Classe2{

   public Classe2(){
     Classe1 c = new Classe1();
     System.out.println(c.nome + " , " + c.valor);
     altera(c);  //por referencia
     System.out.println(c.nome + " , " + c.valor);
   }

   public void altera(Classe1 newC){
      newC.valor = 100;
      newC.nome = "Isso é referencia";
   }

   public static void main(String args[]){
      new Classe2();
   }
}

[quote=marcioa1]Alexandre,

Já li num livro sobre RMI que há passagem por referência, mas acho estranho. Vou procurar este livro e procurar saber se o autor não está falando besteira,

Abraços,

Márcio[/quote]

Eu sempre soube que so existe passagem por valor, nunca por referencia.
Ja dei uma pesquisada e não achei nada ao contrario. Nos cursos que dou, garanto p/ alunos que é por valor… :mrgreen: , tomara que não decubra agora que falei besteira… :mrgreen:

ta, ta, ta, li os topicos que o LIPE passou e todos realmente dizem que nao existe passagem por referencia!! mas entao me expliquem o exemplo que dei ai em cima!!! pq que qual é a logica de “passagem por referencia”? creio que seja, vc passar a variavel(objeto) para um metodo, fazer alterações dentro do metodo e quando voltar a variavel(objeto) estar alterada!! que eu saiba essa é a teoria de “passagem por referencia” mas entao como o objeto do exemplo ai de cima assumiu outros valores?? e onde estao os valores antigos dele???

galera acho que to pirando com esse negocio de passagem por valor e por referencia em java???

Por favor definam Passagem de parametro por Referencia e passagem de parametro por Valor???

quando fiz faculdade e tava aprendendo Delphi era muito simples:

Por Referencia: passo a variavel “a” para o metodo x, faço alterações e quando volto “a” esta com o valor(conteudo) alterado( diferente.)

Por Valor: passo a variavel “a” para o metodo x, faco alterações e quando volto “a” nao sofreu alterações.

e levando essa definição em consideração, é exatamente o que acontece no exemplo que dei ai em cima!!!

fred,

Quando você passa o objeto c nos parâmetros, na verdade está passando uma copia da variável que tem como o endereço o mesmo do objeto c. O método que recebe, recebe uma variável, diferente da variável do método “chamador” , mas com o mesmo endereço de memória, ou seja uma cópia do endereço no qual o objeto está guardado. Ao alterar uma propriedade desta nova referência, você está alterando o endereço de memória, que é o mesmo da primeira variável. Sacou?

Márcio

saquei!!! e essa é a “logica” de passagem por referencia certo!!! pode até ser que o java passa uma “cópia”, mas a “lógica” de funcionamento é de “referencia”, correto??

Caros no livro de certificação da Kathy Sierra na página 118 explica sobre a passagem de referencia, que na verdade usa a semantica de passagem por valor. O Exemplo abaixo imprime o endereço do objeto.

[code]class Test {
int i[] = { 0 };

public static void main(String args[]) {
	int i[] = { 1 };
	System.out.println("obj i1:" + i);
	change_i(i);
	System.out.println("obj i4:" + i);
	System.out.println(i[0]);
}

public static void change_i(int i[]) {
	System.out.println("obj i2:" + i);
	System.out.println("II:" + i[0]);
	int j[] = { 2 };
	i[0] = 40;
	i = j;
	System.out.println("obj i3:" + i);
	System.out.println("I: " + i[0]);
	System.out.println("J: " + j[0]);
}

}
[/code]

Neste código o resultado retornado será o seguinte:
obj i1:[I@3e25a5
obj i2:[I@3e25a5
II:1
obj i3:[I@19821f
I: 2
J: 2
obj i4:[I@3e25a5
40

Olha o livro Logica de programação e estruturas de dados com aplicações em Java de Sandra Puga e Gerson Rissetti, e também desde de 2001 que aprendo Java existe sim passagem de parâmetros por valor e passagem de parâmetros por referência, se alguém estiver ensinando que só existe o primeiro espero que dê uma olhadinha neste livro.

O penúltimo teste foi invalido, pois Strings são imutáveis.

Sim, funciona como a lógica de referência, mas no baixo nível, java sempre vai copiar o parâmetro antes de passá-lo para um método. Na verdade, existe um tipo de variável em java que não é manipulável pelo programador, o chamado reference. Este é o tipo que serve de apontador para o objeto, ou seja, todo objeto em java é apontado por uma variével do tipo reference. O java então cria uma cópia deste variável (reference) antes de invocar um método.