Java: parámetros por referencia o valor

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:

Referencia vs Valor en Java – Pasar objeto

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

Objetos pasados por valor si se crea una nueva instancia – Java

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.

Arreglos en Java – Pasados por referencia

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:

Java – Datos primitivos se pasan por valor

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.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario