Esta duda surge desde que uno se inicia en la programación y empieza a trabajar con métodos/funciones que requieren la manipulación de datos sin tener que generar un valor de retorno.
En otros lenguajes de programación por lo general, siempre los parámetros se pasan por valor y luego existe una sintaxis especial para indicar si un parámetro va a usarse por referencia. Esto es bastante claro y se entiende sus capacidades pero en Java puede resultar confuso porque no lo especifican claramente y tiene definición distinta.
En Java todo se pasa por valor, es decir que no existe el termino «pasar por referencia», aunque obtenemos algo similar cuando utilizamos objetos, realmente estamos pasando como valor es el «puntero» y no una referencia exacta como en otros lenguajes de programación, se comporta similar pero no tiene la misma capacidad.
La premisa que se acostumbra a expresar es que en Java: «Los parámetros primitivos son pasados por valor y los objetos son pasados por referencia» es incorrecta, ya que lo segundo, los objetos pasan en realidad un puntero que actúa como un proxy similar a una referencia, mas no es una referencia real porque eso no existe en java.
Pasar por Valor
Entonces al pasar un primitivo (entero, string, etc) el parámetro es evaluado y se realiza una «copia» a otra localización para luego usar el valor durante la ejecución. Se almacena en una parte de la memoria que es como lo realiza normalmente java y en otros lenguajes puede almacenarlos en otro lugar.
Pasar por Referencia
Para tipos de objetos (Array, objetos, etc) realmente se crea una especie de puntero y no se puede decir que sea una referencia porque se comporta diferente, entonces podemos indicar que «La referencia al objeto es pasada por valor»
Ejemplo al cambiar un valor de un array.
Digamos que tenemos un método que se encarga de agregar un valor a un array, creamos el array en Main pero luego lo pasamos al método y le agregamos un texto.
1 2 3 4 5 6 7 8 9 10 11 12 |
public class MyClass { public static void main(String args[]) { String[] array = new String[1]; cambiar(array); System.out.println("El valor del array es: " + array[0]); } public static void cambiar(String[] array) { array[0] = "Hola Mundo"; } } |
Sin el método «cambio» el valor del array es NULL, pero con el método imprimirá «Hola mundo»
- Cualquier cambio en el contenido del Array a través de esa referencia afectará al array original.
- Pero cambiar la referencia para apuntar a un nuevo Array no cambiará la referencia existente en el método original.
Ejemplo cambiando referencia:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class MyClass { public static void main(String args[]) { String[] array = new String[1]; cambiarReferencia(array); System.out.println("El valor del array es: " + array[0]); } public static void cambiarReferencia(String[] array) { array = new String[1]; array[0] = "Hola Mundo"; } } |
Al usar ese método, no se realiza ningún cambio en el array original e imprimirá NULL. Mientras que en otros lenguajes sí cambiaría la referencia y actualizaría el array principal, en Java no, ya que no maneja una referencia real.
Si deseas probar este código sin tener que instalar nada en tu pc, puedes realizarlo online con algún compilador web. Por ejemplo yo uso mucho este y también tiene mas opciones para otros lenguajes de programación https://www.jdoodle.com/online-java-compiler/
Muy buen articulo pero según tengo entendido String no es un primitivo.