Hoy veremos cómo es que, en Java, se pasan los parámetros a las funciones. Es decir, ¿En Java los parámetros se pasan por referencia o por valor? vamos a comprobarlo y explicarlo con este post.
De entrada te digo que depende del tipo de dato y que, en términos simples, solo los objetos y arreglos se pasan por referencia.
¿Qué es referencia y valor?
Recuerda que estamos hablando de funciones. Las funciones reciben parámetros, también llamados argumentos.
De hecho parámetro se le llama dentro de la función, y argumento se le llama desde donde se invoca a la función.
Se dice que un parámetro se pasa por referencia cuando solo se pasa la referencia al dato, así que si modificamos el valor dentro de la función, se modificará desde donde se invocó.
En cambio, si se pasa por valor, no importa que cambiemos el parámetro, pues en el lugar desde donde la función fue llamada no habrá cambios.
Lo comprobaremos mejor con código.
Los objetos se pueden modificar si se invoca a un método de la clase
Veamos el primer ejemplo para demostrar que los objetos se pasan por referencia.
Con esto me refiero a que si invocamos un método del objeto, y este método cambia algún dato interno, se cambiará incluso desde donde la función fue invocada.
Tenemos el siguiente ejemplo:
Al ejecutar el programa, la salida es:
Si te das cuenta, pudimos cambiar el nombre desde otra función. Por lo tanto, los objetos sí se pueden modificar desde otra función y concluimos en que los objetos se pasan por referencia.
Objetos no pueden ser cambiados si se crea una nueva instancia
Para complementar lo de arriba quiero dejar claro que solo se puede modificar cuando invocamos a un método o cambiamos la propiedad del objeto.
En cambio, si asignamos el objeto a una nueva instancia entonces esto no surtirá efecto y diremos que se pasa por valor.
Veamos el siguiente código en donde creamos un nuevo objeto y lo asignamos al parámetro:
Ahora no invocamos a una función de la clase para que cambie un dato, sino que intentamos cambiar el objeto completo.
Como se ve en la salida, esto no surte efecto: no podemos cambiar un objeto desde un parámetro, pero sí sus propiedades
Arreglos también se pasan por referencia
Veamos el tercer ejemplo pero ahora con arreglos. Los arreglos también se pasan por referencia como lo demuestra el siguiente código:
Si ejecutamos el programa, veremos que después de pasar el arreglo y modificarlo desde una función externa, realmente se modifica desde donde lo invocamos.
Recuerda que esto se logra modificando los valores internos del arreglo, pero no el arreglo completo.
Tipos de datos primitivos se pasan por valor
Los tipos de datos que no son objetos se pasan por valor. Con esto englobamos al tipo int
, float
, String
, etcétera (y eso que String no es primitivo).
Se demuestra con el siguiente ejemplo:
Al ejecutar el programa vemos que los valores siguen intactos:
Resumen
Los datos primitivos no se pueden cambiar, los objetos solo se pueden cambiar si se modifican propiedades de los mismos, pero no si se asigna una nueva instancia.
Definitivamente los arreglos sí se pueden modificar a través del índice, es decir, se puede modificar el contenido de los mismos.
Conclusión
Quiero aclarar que el término pasar por referencia y por valor puede ser inadecuado, pero así se le conoce.
Básicamente lo que intento demostrar es cómo se comportan los distintos datos cuando se modifican desde una función externa, no es como pasar datos por referencia y por valor en C (en donde pasas el apuntador a la dirección de memoria).
Sin embargo así se le llama y, conocer esto hará que entiendas de mejor manera el lenguaje de programación Java.