O que é o conceito de 'passagem por valor' em Java?

Java utiliza o conceito de passagem por valor, onde os parâmetros de métodos recebem cópias dos valores originais.

O que é o conceito de 'passagem por valor' em Java?

Em Java, todos os argumentos passados para métodos são passados por valor. Isso significa que, quando uma variável é passada como parâmetro, o método recebe uma cópia do valor original e não a referência direta da variável.

Passagem por valor com tipos primitivos

Quando passamos um tipo primitivo para um método, o valor real da variável é copiado. Alterações dentro do método não afetam a variável original.

public class TestePassagemValor {
    public static void alterarValor(int numero) {
        numero = numero * 2;
        System.out.println("Valor dentro do método: " + numero);
    }

    public static void main(String[] args) {
        int valor = 10;
        alterarValor(valor);
        System.out.println("Valor fora do método: " + valor);
    }
}

Saída esperada:

Valor dentro do método: 20
Valor fora do método: 10

Como podemos ver, o valor original da variável valor não foi alterado, pois o método recebeu apenas uma cópia.

Passagem por valor com objetos

Diferente dos tipos primitivos, os objetos também são passados por valor, mas o valor copiado é a referência do objeto, não o próprio objeto. Isso significa que podemos modificar os atributos do objeto dentro do método.

class Carro {
    String modelo;
}

public class TestePassagemObjeto {
    public static void modificarCarro(Carro c) {
        c.modelo = "Ferrari";
    }

    public static void main(String[] args) {
        Carro meuCarro = new Carro();
        meuCarro.modelo = "Toyota";
        modificarCarro(meuCarro);
        System.out.println("Modelo do carro: " + meuCarro.modelo);
    }
}

Saída esperada:

Modelo do carro: Ferrari

Neste caso, a referência do objeto foi passada por valor, mas como a referência aponta para o mesmo local na memória, o conteúdo do objeto foi alterado.

Diferença entre passagem por valor e passagem por referência

Característica Passagem por Valor (Java) Passagem por Referência
O que é passado? Uma cópia do valor da variável Um ponteiro para a variável original
Afeta a variável original? Não Sim
Aplicável a Tipos primitivos e referências de objetos Apenas objetos em linguagens como C++

Conclusão

Java sempre usa passagem por valor, tanto para tipos primitivos quanto para objetos. No caso dos objetos, o valor passado é a referência, permitindo modificações internas no objeto, mas não a substituição da referência original.

Muitos programadores iniciantes acreditam que Java usa passagem por referência para objetos, mas isso não é verdade. O que acontece é que a referência do objeto é copiada e passada ao método, permitindo que o objeto seja alterado, mas não sua referência na memória. Isso pode causar confusão ao modificar listas, mapas e outras estruturas. Para evitar problemas, é importante entender esse comportamento e usar técnicas como clonagem de objetos ou criação de novas instâncias quando não se deseja alterar o objeto original.

Algumas aplicações:

  • Controle de parâmetros em métodos Java
  • Evitar modificações inesperadas em objetos
  • Uso eficiente de memória e gerenciamento de variáveis
  • Criação de métodos mais seguros e previsíveis

Dicas para quem está começando

  • Lembre-se de que Java sempre usa passagem por valor
  • Se quiser evitar alterações em objetos, crie cópias antes de passá-los a métodos
  • Para modificar um objeto dentro de um método sem alterar o original, retorne um novo objeto
  • Teste exemplos de código para entender como referências funcionam
  • Evite modificar listas e coleções passadas como argumento se não quiser mudanças inesperadas

Contribuições de Rodrigo Farias

Compartilhe este tutorial: O que é o conceito de passagem por valor em Java

Compartilhe este tutorial

Continue aprendendo:

Como funciona o Garbage Collector em Java

O Garbage Collector em Java é responsável pela liberação automática de memória, removendo objetos que não são mais utilizados pelo programa.

Tutorial anterior

Como comparar strings corretamente em Java

A comparação de strings em Java deve ser feita corretamente utilizando métodos específicos como equals() e compareTo() para evitar erros inesperados.

Próximo tutorial