Passar variáveis para métodos
Em Java quando você passa uma variável para um método, você estará passando uma cópia dos bits que representam esta variável (pass-by-value). Veja os diferentes comportamentos em variáveis primitivas e de referência (objeto).
Variáveis primitivas
Neste caso o que acontece dentro do escopo (método) “morre” lá, ou seja as alterações feitas sobre a variável primitiva serão perdidas. Veja o exemplo abaixo:
package certificacao; public class Primitivo { private static int order = 0; public static void main(String[] args) { Primitivo p = new Primitivo(); int w = 10; p.somar(w); System.out.println( (++order) + " Depois - somar(w): " + w); } public void somar(int w) { w = w + 10; System.out.println( (++order) + " Dentro - somar(w): " + w); } }
Qual sera o resultado?
1 Dentro - somar(w): 20 2 Depois - somar(w): 10
Repare que o parâmetro “w” foi alterado apenas dentro do escopo (método). Exatamente o comportamento esperado – uma copia dos bits sem alterar a variável “w” criada no main.
Variáveis de referência (objeto)
Já no caso das variáveis de referencia (objeto), os valores do objeto podem ser alterados de acordo com o nível de acesso. Veja os exemplos:
public class ReferenciaMain { public static void main(String[] args) { ReferenciaObjeto obj = new ReferenciaObjeto(); somar(obj, 100); System.out.println( "Depois - somar(obj, 100): " + obj.a); alterar(obj); System.out.println( "Depois - alterar(obj): " + obj.a); } static void somar(ReferenciaObjeto referencia, int param) { referencia.a = referencia.a + param; } static void alterar(ReferenciaObjeto referencia) { referencia.a = 555; referencia = new ReferenciaObjeto(); referencia.a = 2222; } } class ReferenciaObjeto { int a = 1000; }
E qual seria o primeiro resultado?
1100 é a resposta correta já que um dos valores do objeto foi alterado.
E o segundo?
Essa é uma questão que confunde. A resposta correta é 555, porque o valor da variável foi alterada e em seguida a variável que era referenciada foi apontada para um novo objeto (new). Lembre que na passagem de parâmetro o objeto referenciado cria um link para o objeto e o perdera em uma nova instancia.
Um adicional (sem passagem de parâmetros)
public class Primitivo { public static void main(String[] args) { int a = 10; int b = a; a = 20; System.out.println("b depois de 'referenciar' a: " + b); } }
E agora? b = 20 ?
No caso acima também será feito uma copia e o valor de “b” resultara em 10. Variáveis primitivas sempre serão copiadas e não referenciadas.
Comentem, estendam o assunto… Compartilhem =)