Desafio Java

Passagem por valor com primitivo e objeto

Enunciado

Crie uma classe PassagemValor com um método alterarPrimitivo(int x) que atribui x = 100 e um método alterarArray(int[] arr) que atribui arr[0] = 100. No main, crie um int numero = 10 e um int[] numeros = {10, 20}, chame os métodos e imprima os valores antes e depois. Explique no código com comentários por que o primitivo não muda e o array muda.

Requisitos

  • O método alterarPrimitivo deve receber int e modificar o parâmetro.
  • O método alterarArray deve receber int[] e modificar o primeiro elemento.
  • A saída deve mostrar que numero permanece 10 e numeros[0] vira 100.
  • Inclua comentários explicando a passagem por valor.

Código inicial

public class PassagemValor {
    // Implemente os métodos

    public static void main(String[] args) {
        // Teste e imprima
    }
}

Saída esperada

Antes: numero = 10, numeros[0] = 10
Depois: numero = 10, numeros[0] = 100
Ver dica

Lembre-se: Java copia o valor do argumento. Para objetos, copia a referência, então o array apontado é o mesmo.

Mostrar solução
public class PassagemValor {
    // Recebe uma cópia do valor primitivo
    static void alterarPrimitivo(int x) {
        x = 100; // altera apenas a cópia local
    }

    // Recebe uma cópia da referência do array
    static void alterarArray(int[] arr) {
        arr[0] = 100; // altera o objeto apontado pela referência
    }

    public static void main(String[] args) {
        int numero = 10;
        int[] numeros = {10, 20};

        System.out.println("Antes: numero = " + numero + ", numeros[0] = " + numeros[0]);

        alterarPrimitivo(numero); // passa cópia de 10
        alterarArray(numeros);    // passa cópia da referência ao array

        System.out.println("Depois: numero = " + numero + ", numeros[0] = " + numeros[0]);
    }
}

Passo a passo

  1. Declaramos a classe PassagemValor.
  2. O método alterarPrimitivo recebe int x e faz x = 100. Como x é uma cópia do valor passado, a variável original não é afetada.
  3. O método alterarArray recebe int[] arr. O parâmetro é uma cópia da referência, mas aponta para o mesmo array na memória.
  4. Dentro de alterarArray, arr[0] = 100 modifica o elemento do array original.
  5. No main, criamos numero = 10 e numeros = {10, 20}.
  6. Imprimimos os valores antes das chamadas.
  7. Chamamos alterarPrimitivo(numero) — passa cópia de 10; e alterarArray(numeros) — passa cópia da referência.
  8. Imprimimos depois: numero continua 10; numeros[0] vira 100.

Por que funciona

Java é sempre passagem por valor. Para tipos primitivos, o valor é copiado; alterar o parâmetro não reflete fora. Para objetos (como arrays), o valor copiado é a referência; o objeto em si é o mesmo, então alterações em seus campos ou elementos são visíveis fora do método. Isso explica por que numero não muda, mas numeros[0] muda.

Erros comuns

  • Achar que alterarPrimitivo modifica numero: não modifica, pois x é cópia.
  • Tentar reatribuir o array dentro do método: arr = new int[]{100}; não afeta a referência original, pois a cópia local passa a apontar para outro array.
  • Confundir passagem por referência com passagem por valor: Java não passa objetos por referência; passa a referência por valor.

Outra forma de resolver

Retornar o novo valor em vez de tentar alterar o parâmetro:

static int alterarPrimitivo(int x) {
    return 100;
}
// uso: numero = alterarPrimitivo(numero);

Preferível quando se quer deixar explícito que o valor será substituído.

Saída esperada

Antes: numero = 10, numeros[0] = 10
Depois: numero = 10, numeros[0] = 100