Passagem por valor em java

O conceito de passagem por valor em java,usa argumentos de métodos. No entanto, é importante entender como isso se aplica a tipos primitivos e tipos de referência para compreender completamente o comportamento.

Passagem por Valor em Java

Passagem por valor significa que o valor real do argumento é passado para o método, e não uma referência ao valor. Portanto, qualquer modificação feita ao valor dentro do método não afeta o valor original fora do método.

Tipos Primários e Tipos de Referência

Tipos Primitivos

Passagem por valor significa que o valor real do argumento é passado para o método, e não uma referência ao valor. Portanto, qualquer modificação feita ao valor dentro do método não afeta o valor original fora do método.

Exemplo:

public class PassagemPorValor {
    public static void main(String[] args) {
        int a = 10;
        alterarValor(a);
        System.out.println("Valor de a após chamar o método: " + a); // a ainda é 10
    }

    public static void alterarValor(int x) {
        x = 20; // Altera a cópia local de x, não a variável original
    }
}

Neste exemplo, o valor de a não é alterado fora do método alterarValor, pois x é uma cópia do valor de a.

Tipos Referência

Para tipos de referência (como objetos e arrays), a passagem por valor ainda se aplica, mas o que é passado é o valor da referência (ou seja, o endereço do objeto na memória). Portanto, enquanto a referência em si é passada por valor (ou seja, você não pode mudar a referência para apontar para um novo objeto), o objeto referenciado pode ser modificado através dessa referência.

Exemplo:

public class PassagemPorReferencia {
    public static void main(String[] args) {
        Pessoa p = new Pessoa("João");
        alterarNome(p);
        System.out.println("Nome após chamar o método: " + p.nome); // Nome é alterado para "Maria"
    }

    public static void alterarNome(Pessoa pessoa) {
        pessoa.nome = "Maria"; // Modifica o objeto referenciado
    }
}

class Pessoa {
    String nome;
    Pessoa(String nome) {
        this.nome = nome;
    }
}

Neste exemplo, o objeto p é passado para o método alterarNome, e o nome do objeto é alterado. A referência ao objeto em si não é alterada (não é possível fazer p = novoObjeto dentro do método), mas as propriedades do objeto referenciado são modificadas.

Resumo

  • Passagem por Valor para Tipos Primitivos: Uma cópia do valor é passada. Alterações ao valor dentro do método não afetam o valor original.
  • Passagem por Valor para Tipos de Referência: A referência ao objeto é passada por valor (ou seja, uma cópia do endereço do objeto). Alterações ao objeto referenciado afetam o objeto original, mas você não pode mudar a referência para apontar para um novo objeto.

Se precisar de mais detalhes ou tiver outras dúvidas, sinta-se à vontade para perguntar!