¿Como funcionan la malditas referencias en Java?


Este escrito te explica como funcionan las referencias en java. Una de los problemas que tienen los que están aprendiendo a programar son las referencias,  pues estas se ocultan en la sintaxis  del lenguaje de tal forma que se confunde con el concepto de objeto, complicando las cosas cuando se están trabajando estructuras de datos complejas.

Y empecemos de una vez. Veamos la primera ilustración.

ReferenciasyCicloDeVidaDeLosObjetos-00100Tanto esta ilustración como las siguientes usan como lenguaje gráfico el UML, más exactamente los diagramas de objetos, y en los comentarios UML se usan para el código en lenguaje Java. Este código se encuentra en la primera columna de la izquierda y en la de la derecha está la representación gráfica de lo que hace el el código de la izquierda. Por ejemplo, en la columna izquierda está una declaración de clase y en la derecha está la clase en UML. Todo el código a continuación se basará en esta definición de clase.  Veamos la siguiente sentencia.

ReferenciasyCicloDeVidaDeLosObjetos-00200

En el código java tenemos una declaración de una referencia, la v1, que va ha referenciar objetos de clase C1. Fíjate que en la representación gráfica solo tenemos una flecha y ese es lo que es una referencia algo que “señala” que referencia a otro algo que es un objeto. Fíjate además que la flecha, la referencia, está apuntando a algo que se llama null, esto quiere decir que la referencia v1 no está referenciando a algún objeto.

ReferenciasyCicloDeVidaDeLosObjetos-00300

En la anterior se crea un objeto, el que aparece en verde, y mediante la asignación (el igual) se pone a referenciar a v1 ese objeto verde. Fíjate que hasta que no se hace un new la referencia no tenía ningún objeto. Es el new el que crea lo objetos.

Para que veas la diferencia mira el siguiente dibujo.

ReferenciasyCicloDeVidaDeLosObjetos-00400

En éste tenemos otra referencia la v2 y se pone a referenciar al mismo objeto verde mediante una asignación.

ReferenciasyCicloDeVidaDeLosObjetos-00500

Ahora declaramos una nueva referencia, la v3, y la ponemos a null explicítamente. Si bien el java hace esto automáticamente para toda nueva referencia es una buena práctica hacerlo explícitamente.

ReferenciasyCicloDeVidaDeLosObjetos-00600

Ahora tenemos dos sentencias java: la primera asigna el valor 5 al objeto verde mediante la referencia v2. Este “mediante” es importante por que es por medio de las referencias que hacemos cosas a los objetos. La segunda sentencia cambia a donde está referenciando v1, la pone a null.

ReferenciasyCicloDeVidaDeLosObjetos-00700

En esta nueva ilustración tenemos algo más Complejo. Estemos declarando una arreglo de objetos C1, que en el momento esta referenciado por a1. Importante, cada una las las posiciones del arreglo es en realidad una referencia. Esto lo vemos mejor en las siguientes imágenes.

ReferenciasyCicloDeVidaDeLosObjetos-00800En la anterior adicionamos un elemento al arreglo referenciado por a1. Fíjate que lo que realmente hace es hacer que la posición cero del arreglo referencia al objeto verde.

ReferenciasyCicloDeVidaDeLosObjetos-00900Aquí creamos un nuevo objeto, el dorado, y lo referenciamos con v1.

ReferenciasyCicloDeVidaDeLosObjetos-01000Y mediante esta nueva referencia cambiamos el atributo val del objeto dorado.

ReferenciasyCicloDeVidaDeLosObjetos-01100Ahora creamos un nuevo objeto, el verde militar, pero mira que usamos v1 que estaba antes referenciando al objeto dorado. ¡El objeto dorado queda ahora sin ninguna referencia! Y usando la misma v1 cambiamos el atributo val del objeto verde militar, como está referenciando otro objeto distinto pues cambia ese objeto.

Por otro lado, Mira lo que pasa con el objeto dorado en la siguiente ilustración.

ReferenciasyCicloDeVidaDeLosObjetos-01200

¡Desaparece!

Cuando un objeto se queda sin referencias después de un tiempo pasa el Recolector de basura y libera el espacio ocupado por él, esto es ese espacio de memoria puede usarse para un nuevo objeto.

ReferenciasyCicloDeVidaDeLosObjetos-01300En esta nueve ilustración creamos un nuevo arreglo, el azul, que está referenciado por a2.

ReferenciasyCicloDeVidaDeLosObjetos-01400

Aquí se crea un nuevo objeto, el morado, referenciado por v3 y además se modifica el atributo val mediante esa referencia.

ReferenciasyCicloDeVidaDeLosObjetos-01500

Ahora se adiciona la referencia al objeto morado, esta referencia queda en los posición cero del arreglo.

ReferenciasyCicloDeVidaDeLosObjetos-01600

Se hace lo mismo pero esta vez referenciando al objeto verde militar y ésta referencia queda en la posición uno.

ReferenciasyCicloDeVidaDeLosObjetos-01700Ahora una tercera vez pero referenciando al objeto verde.

ReferenciasyCicloDeVidaDeLosObjetos-01800Ahora la referencia a1 la ponemos al arreglo azul, así que el arreglo inicial se queda sin referencias, y ya debes saber que pasa a coninuación.

ReferenciasyCicloDeVidaDeLosObjetos-01900¡Pasa el recolector de basura y desaparece el arreglo!

ReferenciasyCicloDeVidaDeLosObjetos-02000En esta imagen v2 se pone a referenciar al objeto morado, que también está referenciado por la posición cero del arreglo azul.

ReferenciasyCicloDeVidaDeLosObjetos-02100Aquí removemos las referencia de las posiciones uno y dos del arreglo azul. Mira como el objeto verde queda sin referencias.

ReferenciasyCicloDeVidaDeLosObjetos-02200Y pasa el recolector de basura.

ReferenciasyCicloDeVidaDeLosObjetos-02300Y finalmente se modifica al atributo val mediante del objeto verde militar mediante la referencia v1.

Y eso es todo. Puedes seguir desarrollando el ejemplo su quieres.

Y para terminar un consejo. Cuando estás trabjando con referencias en especial con estructuras de datos puedes entender más lo que está pasando si haces dibujos. No tiene que ser necesariamente en UML, pero haz dibujos verás que aprenderás mucho con ello.

En necesario mencionar que este ejemplo fue tomado del libro Introducción a las Estructuras de Datos: Aprendizaje Activo Basado en Casos
de Jorge A. Villalobos S., uno de los mejores libros que se han escrito sobre estructuras de datos. Lo digo no por que sea un libro erudito sobre la materia, sino por que tiene una propuesta educativa con la cual los estudiantes si aprenden.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: