Paso por valor o por referencia


Muchos de nosotros sabemos que los objetos en Java se manejan por referencia y cuando le pasamos un objeto como parámetro a un método, entonces este objeto va como una referencia. Y cualquier modificación en el objeto desde adentro del método repercute en el objeto de afuera. Veamos un ejemplo:

import java.util.*;
public class Ejemplo1{
    public static void main(String args[]){
        ArrayList<Integer> numeros = new ArrayList<Integer>();
        agregarNumero(numeros, 4);
        agregarNumero(numeros, 5);
        System.out.println(numeros.toString());
    }
    public static void agregarNumero(ArrayList<Integer> a, int num){
        a.add(num);
    }
}

El programa anterior funciona tal como uno espera y su salida es:
[4, 5]

Sin embargo, ¿es verdad que el ArrayList de numeros se está pasando como referencia?
Veamos este nuevo programa:

import java.util.*;
public class Ejemplo1{
    public static void main(String args[]){
        ArrayList<Integer> numeros = new ArrayList<Integer>();
        ponerANull(numeros); // Nueva línea
        agregarNumero(numeros, 4);
        agregarNumero(numeros, 5);
        System.out.println(numeros.toString());
    }
    public static void agregarNumero(ArrayList<Integer> a, int num){
        a.add(num);
    }
    public static void ponerANull(ArrayList<Integer> a){
        a = null;
    }
}

Si ejecutamos este programa, ¿qué ocurre? ¿debería lanzarse una excepción de NullPointerException, no?
Sin embargo, su salida es:
[4, 5]

Es exactamente la misma salida que obtuvimos en el programa anterior. ¿Qué pasó acá? Le seteamos null al arreglo numeros y a pesar de eso sigue pudiendo agregar los números.

2 comentarios:

  1. Lo que ocurre es que nunca se pasa el parámetro por referencia. Siempre se pasa por valor, es decir, una copia del valor. Quedarían dos variables DIFERENTES apuntando al mismo objeto. Si una variable pasa a apuntar a otro objeto (o a null) entonces la otra variable no tiene por qué cambiar.

    ResponderEliminar