Passagem parâmetro por VALOR ou REFERÊNCIA

Em C quando queriamos que uma função modificasse o valor da variável que era passada por parametro usavamos o operador & que passava o endereço da memória…

char b='c'; mudavalor(b&); // aqui o método mudavalor poderia alterar o conteúdo da variável b

Em VB temos que informar obrigatoriamente no parâmetro da função ou método que é por valor (val) ou por referência (ref)

[code]dim b as string
b=“c”;

public function mudavalor(byval letra as string) //Pega apenas o valor do parâmetro

public function mudavalor(byref letra as string) //Pega o endereço na variável, e pode mudar seu conteúdo[/code]

Tem como fazer isso no JAVA?
Passar o ponteiro (endereço) de uma variável para uma classe ou função que possa modificar o valor desta variável?

Cara.

Como a história é complexa, te aconselho a procurar nos tópicos aqui no GUJ mesmo, existem muitos tópicos sobre isso aqui.

Aprenda Java e esqueça essas coisas loucas da sua cabeça!!!

toda passagem de parametros no java eh por copia.

[quote=java]Tem como fazer isso no JAVA?
Passar o ponteiro (endereço) de uma variável para uma classe ou função que possa modificar o valor desta variável?

[/quote]

Não tem como…

T+

Já houve 3 momentos no meu aprendizado desse assunto:

1: Não sabia nem oq era isso de passagaem por referência ou parâmetro =P

2: Achava q variáveis primitivas eram passadas por cópia (valor), e objetos por referência

3: Sei q a passagem de parâmetros de métodos em java são SEMPRE por cópia(valor)

Muita gente fica no segundo momento, e eu ficaria se n estivesse estudando para certificação =P

Apesar de muita gente falar q java passa objetos por referência, na realidade o java passa uma cópia da sequência de bits de uma variável de referência, em outras palavras, ele copia o endereço do objeto na memoria em outra variavel, então essa variável passa a se referenciar a o mesmo objeto, porém se vc atribuir a nova variável um endereço de outro objeto, a variável anterior não passará a se referenciar a esse novo objeto.

Se estiver errado me avisem, q adicionarei um quarto momento ao meu aprendizado =P

[quote=diego2005][quote=java]Tem como fazer isso no JAVA?
Passar o ponteiro (endereço) de uma variável para uma classe ou função que possa modificar o valor desta variável?

[/quote]
Não tem como…
T+[/quote]

Se estivermos falando de objetos, vc sempre pode fazer coisas estranhas via Reflection.

Assunto polêmico, mas vamos lá.

Em Java, NÃO EXISTE passagem por referência, tudo é passado por valor.

Ai alguém fala:
“Mas objetos são passados por referência”. Não é bem assim…

Em Java, tudo que não for um tipo primitivo (boolean, char, byte, short, int, long, float e double) é uma referência. Esse tipo referência contém um VALOR, sendo o mesmo que é passado em um método.

Daí que vem a confusão… Em Java nós não trabalhamos diretamente com endereçamento (ponteiros e referências)

Confuso né… O que tem q se ter em mente é que as referências em Java não são referências tipo C/C++, é necessário interpretá-las de outra forma (apesar de parecido…)

Se alguém puder ajudar com mais conceitos seria interessante.

Como já postaram acima, já tiveram posts aqui no guj tratando do assunto…

Até mais!

[quote=java]Em C quando queriamos que uma função modificasse o valor da variável que era passada por parametro usavamos o operador & que passava o endereço da memória…

char b='c'; mudavalor(b&); // aqui o método mudavalor poderia alterar o conteúdo da variável b

Em VB temos que informar obrigatoriamente no parâmetro da função ou método que é por valor (val) ou por referência (ref)

Tem como fazer isso no JAVA?
[/quote]

Como Java é uma linguagem moderna teve tempo de aprender desses exemplos. Em Java temos 4 tipos de variáveis primitivas: numericos (int,long,short, etc…), logicos (boolean) , caracter (char) e de referencia.

As variáveis de referencia guardam um numero (tal como todas as outras) que representa o endereço na JVM do objeto. Esse numero depende da implementação da JVM e o programador não precisa saber qual é.
Bom, quando um primitivo é passado como argumento é sempre por valor. Como todos os tipos em Java são primitivos, então todos são passados por valor.


int a = 3;
inc(a);

inc(int b){
  b++;
} 

Isto significa que a e b tem o mesmo valor, mas não são a mesma variável. Alterar b , altera apenas b e nunca a. Embora existam práticas que afirmam que todos os argumentos devem ser declarados final, isso é completamente desnecessário já que a JVM garante que a variável é sempre passada por valor.

Quando se passa uma variável de referencia, o principio é o mesmo, já que vc nunca está passando o objeto , mas sim a variável que o referencia. Entenda que um numero qualquer de variáveis podem referenciar o mesmo objeto e por isso não faz sentido passar o objeto.
Mas como isto influencia o uso ?
Bom, em C e VB um objeto é um tipo especial de variável. Quando vc declara uma variável como um objeto a variável é realmente o objeto.
Em C vc pode pegar um objeto e obter a sua referencia (com o &) ou o seu ponteiro com (*) ou seja, vc parte do objeto e pega um tipo mais simples que é a referencia. Isto permite q vc trabalhe com 3 conceitos explicitamente. Em VB vc não trabalha com pode obter a referencia (já que ela não serve para nada) mas pode dizer se quer usar passagem por valor ou por referencia. Nestas linguagens passa por valor significa: copia o objeto para outro objeto e passa esse novo objecto - repare , ele copia o objeto todo. E passar por referencia significa: passa este objeto.

Então no que o Java é diferente ? É diferente no conceito de que o objeto não é um tipo de variável e portanto, não tem como copiar o objeto em si. Apenas a referencia a ele. Ora, o que sempre queremos é passar a referencia de forma a usar dentro do método o mesmo objeto que nos foi passado. Se quisermos copiar o objeto ele próprio usamos, explicitamente, o método clone().
Mas porque sempre o java passa por valor e nunca por referencia ?
Porque se passase por referencia o codigo a seguir seria um tremento problema:


SomeObject a  = new SomeObject();
destroy(a)
a.setProperty(34565);


destroy(Object b){
   b= null;
}

Se fosse por referencia, ou setar b para null (ou seja, limpado a referencia ) a invocação a.setProperty() daria um NullPointerException
Em Java ,realmente como tudo é passado por valor , isto nunca acontece. Ou limpar b, vc está limpando b e não a.

O motivo para isto é mais sutil. O motivo para passar sempre por valor é para criar uma delimitação coerente entre os escopos das variáveis. Coisa que C e VB não fazem e por isso são aquela zona. Delimitar o escopo das variáveis, por sua vez é extremamente importante para o GC saber quando o objeto não é mais referenciado. Quando se sai de um método, por exemplo, todas as variáveis usadas dentro dele são limpas automaticamente o que evita que vc faça um monte de x = null manualmente.

Moral da historia: Não ha sequer porque se preocupar com o tipo de passagem em Java porque só ha uma. A maravilha, é que uma só resolve tudo o que vc quiser fazer.

2 curtidas

Aeee galera esperta…
MUITO OBRIGADO PELA AJUDA DE VCS…
Dá até pra usar este post como artigo…

VALEU MESMO!
AEEEEEEEEEEE :smiley: :smiley: :D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D

Eu sei que o tópico é um pouco antigo, mas vale pra quem tiver essa mesma dúvida… tem um exemplo bem legal de como funciona a passagem de parâmetro do java.

flws

1 curtida