Saltar al contenido principal

🔗 Paso por Valor vs Referencia

En Java, todo se pasa por valor, pero hay diferencias entre primitivos y objetos.

Tipos Primitivos: Por Valor

Se copia el valor de la variable. Modificar la copia no afecta el original.

public static void modificar(int numero) {
numero = 100; // Modifica la copia
}

public static void main(String[] args) {
int x = 5;
modificar(x);
System.out.println(x); // 5 (no cambió)
}

Tipos Referenciados: Referencia por Valor

Se copia la referencia al objeto. Ambas referencias apuntan al mismo objeto.

public static void modificar(int[] arreglo) {
arreglo[0] = 100; // Modifica el objeto original
}

public static void main(String[] args) {
int[] nums = {1, 2, 3};
modificar(nums);
System.out.println(nums[0]); // 100 (cambió)
}

Diagrama Visual

Primitivos:
┌─────┐ ┌─────┐
│ x │ → │ 5 │ (valor)
└─────┘ └─────┘

Referencias:
┌─────┐ ┌──────────┐
│ ref │ → │ {1,2,3} │ (objeto en heap)
└─────┘ └──────────┘

┌─────┐
│copy │ → (misma dirección)
└─────┘

Reasignar vs Modificar

// Reasignar la referencia NO afecta el original
public static void reasignar(int[] arr) {
arr = new int[]{100, 200}; // Nueva referencia
}

int[] nums = {1, 2, 3};
reasignar(nums);
System.out.println(nums[0]); // 1 (no cambió)

// Modificar el contenido SÍ afecta el original
public static void modificar(int[] arr) {
arr[0] = 100; // Modifica el objeto
}

modificar(nums);
System.out.println(nums[0]); // 100 (cambió)
Resumen
  • Primitivos: Se copia el valor, original no cambia
  • Referencias: Se copia la referencia, modificar el objeto afecta el original
  • Reasignar: Crear nuevo objeto no afecta el original