[OCPJP6] 022 – Atribuições

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 =)