Software Guru Conference & Expo 2014

Paso de parámetros en Java

 

Introducción

image

Variables primitivas.

Básicamente consisten en variables de alguno de los tipos primitivos.

Variables de Referencia.

También se les llama variables de objeto. Estas variables no son el objeto mismo, son solo una referencia al objeto. Imaginemos tener una variable de tipo Date.

private Date fechaLimite;

Al crear el objeto con el operador new, sucede algo como lo mostrado en la imagen de abajo.

image

fechaLimite no es el objeto en si, más bien es una referencia al objeto Date.

En Java, el valor de toda variable de objeto es una referencia de un objeto que reside en algún otro lugar. El valor proporcionado por el operador new también es una referencia.

La expresión new Date() crea un objeto del tipo Date, y su valor es una referencia del objeto recién creado. Esa referencia se almacena entonces en la variable fechaLimite. Las referencias de objeto son equivalentes a los punteros de C++, sin embargo, en Java no es posible manejar punteros y la administración de memoria es una tarea del Garbage Collector.

 

Existe Existe en la terminología de las Ciencias Computacionales para el paso de parámetros a los métodos.

Paso por valor o copia. Significa que el método obtiene solamente el valor (una copia) que proporciona quien hace la llamada.

● Paso por Referencia. Significa que el método recibe la ubicación de la variable que proporciona quien hace la llamada.

 

Ahora si, una vez aclarado lo anterior, podemos comenzar a desmentir a esa falsa creencia que en Java el paso de parámetros es por Referencia.

Existe una creencia errónea muy difundida de que en Java el paso de parámetros se realiza de dos formas.

● Los tipos primitivos se pasan por valor. ● Los objetos se pasan por referencia.

 

Es necesario aclarar que en Java solo existe un único modo de paso de parámetros. Paso por valor. Y lo anterior, es independiente si se trata de un tipo primitivo o un objeto.

Primer Ejemplo.

Si tenemos el siguiente método.

image

Ahora creamos un objeto Empleado para triplicar el sueldo.

image  Hasta aquí todos concordamos que no se altera el valor de porcentaje.

image

Definitivamente comprobamos los tipos primitivos son pasados por valor. Ahora, veamos con un segundo ejemplo si tienen razón al decir que los objetos son pasados por referencia.

Segundo Ejemplo.

Tenemos una clase Empleado. El primer parámetro del constructor es el nombre, el segundo, tercero y cuarto es el día, mes y año respectivamente de su fecha de contrato en la empresa.

image

Observemos como al empleado en cuestión le asignamos como fecha de contrato el 11 de Junio del 2009.

Al imprimir la fecha de contrato podremos observar que dicha fecha fue alterada ya que obtenemos una fecha del 11 de Junio de 1999! Le hemos quitado 10 años de trabajo al empleado!

Básicamente lo anterior no es un paso de parámetros, pero es un buen ejercicio de calentamiento para prepararnos con lo que sigue.

Tercer Ejemplo.

Entremos en materia pues y hagamos un método que reciba como parámetro un Objeto de tipo Empleado.

image

Ahora vamos a crear un objeto Empleado y pasarlo como parámetro al método triplicarSueldo.

image

Upss!!!!!!!!!! El sueldo del empleado ya no es el mismo!!!!!!!!!!!!!! oh nooooo, tenían razón!! Los parámetros en Java se pasan por referencia :( me equivoque! Bueno ni modo, cerrare el blog. Nos vemos……

……………………….

……………………….

Bueno soy malo para fingir pero hice mi mejor esfuerzo. La verdad es que pese a lo anterior, los objetos son pasados por valor, le guste a quien le guste así es y será por los siglos de los siglos. Lo que realmente sucede es que se pasa una copia de la referencia!

¿Copia de la referencia?… Pero que es eso? De que hablo?.. Bueno, esto se explicará en la segunda parte de este artículo.

Nos vemos a la próxima!!