DEV Community

Emanoel Carvalho
Emanoel Carvalho

Posted on

Entendendo Variáveis por Valor e por Referência em Java

Em Java, é importante entender como as variáveis são passadas para métodos. A linguagem usa dois conceitos principais: passagem por valor e passagem por referência. Neste artigo, vamos explicar a diferença entre esses dois comportamentos e como isso afeta o seu código.

Passagem por Valor

Quando falamos de passagem por valor, isso significa que o valor da variável é copiado para o parâmetro do método. Ou seja, a variável original não é alterada se o valor do parâmetro for modificado dentro do método. Isso acontece com tipos primitivos em Java, como int, float, boolean, etc.

Exemplo de Passagem por Valor

public class PassagemPorValor {
    public static void main(String[] args) {
        int x = 10;
        System.out.println("Antes: " + x);
        modificarValor(x);
        System.out.println("Depois: " + x);
    }

    public static void modificarValor(int a) {
        a = 20;
    }
}
Enter fullscreen mode Exit fullscreen mode

Saída:

Antes: 10
Depois: 10
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, a variável x é passada para o método modificarValor(). Porém, dentro do método, a variável a recebe um valor diferente, mas isso não afeta a variável x original, já que x foi passado por valor.

Passagem por Referência

Por outro lado, a passagem por referência ocorre quando, em vez de passar uma cópia do valor, passamos uma referência para o objeto. Isso significa que, se o objeto referenciado for modificado dentro do método, a alteração será refletida na variável original, já que ambos (a variável original e a do método) apontam para o mesmo objeto na memória.

Em Java, a passagem por referência ocorre com objetos (tipos não primitivos, como String, ArrayList, etc.).

Exemplo de Passagem por Referência

import java.util.ArrayList;

public class PassagemPorReferencia {
    public static void main(String[] args) {
        ArrayList<Integer> lista = new ArrayList<>();
        lista.add(10);
        System.out.println("Antes: " + lista);
        modificarLista(lista);
        System.out.println("Depois: " + lista);
    }

    public static void modificarLista(ArrayList<Integer> list) {
        list.add(20);
    }
}
Enter fullscreen mode Exit fullscreen mode

Saída:

Antes: [10]
Depois: [10, 20]
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, a variável lista é passada para o método modificarLista(). Como lista é um objeto, o método tem acesso à mesma instância de ArrayList e pode modificar seu conteúdo. Por isso, o valor da lista original foi alterado.

Resumo

  • Passagem por valor: Em Java, tipos primitivos são passados por valor. Isso significa que qualquer modificação feita no parâmetro dentro do método não afeta a variável original.

  • Passagem por referência: Objetos (como arrays e instâncias de classes) são passados por referência. Isso significa que se o objeto for modificado dentro do método, a mudança será refletida fora do método também.

A diferença entre esses dois tipos de passagem pode ter um grande impacto no comportamento do seu código, especialmente quando se trata de manipulação de dados complexos ou grandes volumes de informações.

Top comments (0)