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.
¿Què paso al final?
ResponderEliminarLo 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