JavaRush /Blogue Java /Random-PT /Passando parâmetros em Java
vincent_vega
Nível 24
Gainesville

Passando parâmetros em Java

Publicado no grupo Random-PT
Uma variável em Java é um contêiner que contém um valor. Então, o que significa “passar” uma variável? E qual é a diferença entre tipos de dados primitivos e de referência.
Passando parâmetros em Java - 1
Falaremos disso mais tarde. Vamos começar com uma tarefa simples primeiro. O que este código faz:
int х = 3;
int у = х;
Na linha 1, uma variável x do tipo int é criada e recebe o valor 3. Na linha 2, uma variável y do tipo int é criada e recebe o valor da variável x . No futuro, a variável x não afetará y de forma alguma . Java copia o valor de x (3) e coloca essa cópia em y . Isso está passando um parâmetro por valor. Você não escreve uma variável para outra. O valor é copiado e atribuído a uma nova variável. Expressão y = x; NÃO significa "escrever x em y ". Significa "copiar o valor dentro de x e escrever essa cópia em y ". Se mais tarde eu mudar y :
у = 34;
Isso afetará x ? Claro que não. x ainda tem o valor 3. Se eu alterar x mais tarde :
х = 90;
Como isso afetará você ? Sem chance. Eles não estão relacionados de forma alguma após a atribuição ter sido feita (COPIANDO o valor). E quanto aos tipos de referência? Como eles funcionam? Não é tão difícil, na verdade a regra é a mesma. Os links fazem a mesma coisa – você recebe uma cópia do link. Então se eu disser:
Cat A = new Cat ();
Cat B = A;
O link A é copiado para o link B. Isso não se aplica ao objeto - você ainda possui apenas um objeto. Mas agora você tem duas referências diferentes controlando o mesmo objeto Cat . Agora vamos ver como passar parâmetros para métodos. Java passa parâmetros por valor. Sempre. Isso significa "copiar o valor e passar a cópia". Para tipos primitivos é fácil:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
O método doStuff se parece com isto:
void doStuff (int у) {

   / / Действия с 'y'
}
Uma cópia do valor de x , ou seja, 5, é passada para o método doStuff() . O método doStuff() possui sua própria variável chamada y . A variável y é uma variável nova e diferente. Com uma cópia do que estava em x no momento de passar para o método. De agora em diante, y e x não terão efeito um sobre o outro. Quando você altera y , você não afeta x .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
E vice-versa – se você mudar x , você não mudará y . A única coisa que x fez neste caso foi copiar seu valor e passá-lo para o método doStuff() . Como funciona a "passagem por valor" com referências? Muitas pessoas dizem: “Java passa tipos primitivos por valor e objetos por referência”. Não é o que eles dizem. Java passa tudo por valor. Com primitivos, você obtém uma cópia do conteúdo. Com os links você também obtém uma cópia do conteúdo. Mas qual é o conteúdo do link? Controle remoto. Facilidades para gerenciar/acessar a instalação. Quando você passa uma referência de um objeto para um método, você está passando uma cópia da referência. Clone de controle remoto. O objeto ainda está na pilha onde foi criado, esperando que alguém use o controle remoto. A instalação não se importa com quantos controles remotos estão “programados” para controlá-la. As únicas pessoas que se importam com isso são o coletor de lixo e você, o programador. Então, quando você diz:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Existe apenas um objeto Cat . Mas agora dois controles remotos (links) podem acessar o mesmo objeto Cat . Então agora tudo o que B fizer ao objeto Cat afetará o Cat apontado por A , mas não afetará o conteúdo de A ! Você pode alterar Cat usando o novo link B (copiado diretamente de A ), mas não pode alterar A. Que diabos isso significa? Você pode alterar o objeto ao qual A se refere , mas não pode alterar a referência de A - redirecioná-lo para outro objeto ou null . Portanto, se você alterar a referência de B (não o objeto Cat real ao qual B faz referência , mas o valor da referência em si), você não alterará o valor de A . E vice versa. Então:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Significa simplesmente que B aponta para outro objeto. A ainda está feliz. Então repita comigo: Java passa tudo por valor. (Ok, mais uma vez... com sentimento.) Java passa tudo por valor. Para tipos primitivos você passa uma cópia do valor atual, para referências de objetos você passa uma cópia da referência (controle remoto). Você nunca passa pelo objeto. Todos os objetos são armazenados no heap. Sempre. Agora prepare uma boa xícara de café e escreva algum código! Artigo original .
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION