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
alterarPrimitivodeve receberinte modificar o parâmetro. - O método
alterarArraydeve receberint[]e modificar o primeiro elemento. - A saída deve mostrar que
numeropermanece 10 enumeros[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
- Declaramos a classe
PassagemValor. - O método
alterarPrimitivorecebeint xe fazx = 100. Comoxé uma cópia do valor passado, a variável original não é afetada. - O método
alterarArrayrecebeint[] arr. O parâmetro é uma cópia da referência, mas aponta para o mesmo array na memória. - Dentro de
alterarArray,arr[0] = 100modifica o elemento do array original. - No
main, criamosnumero = 10enumeros = {10, 20}. - Imprimimos os valores antes das chamadas.
- Chamamos
alterarPrimitivo(numero)— passa cópia de 10; ealterarArray(numeros)— passa cópia da referência. - Imprimimos depois:
numerocontinua 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
alterarPrimitivomodificanumero: não modifica, poisxé 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