domingo, 14 de enero de 2018

¿Apuntadores en Java?


¿Apuntadores en Java?

Es común leer en la literatura sobre Java que este lenguaje no tiene apuntadores. Realmente los tiene escondidos. Lo que no tiene es un tipo de dato apuntador, es decir, que no puede declarar una variable de tipo apuntador a nada. 

¿Pero que es un apuntador?

Un apuntador o puntero es una variable capaz de almacenar direcciones de memoria y mediante los operadores adecuados acceder a la información que contiene la dirección de memoria a la que "apunta" en cada momento.

Sin embargo, las variables que uno declara de un tipo que es una clase, en nuestro nuevo vocabulario se llaman instancias de una clase u objetos, son realmente apuntadores al objeto. Por eso los tenemos que inicializar con un new.
Suponga que hemos definido una clase miClase y que declaramos dos variables

miClase v1 = new miClase(), v2 = new miClase();
¿Qué pasa si en un lugar del código hacemos la instrucción?
v1 = v2;?
Aquí estamos suponiendo que miClase tiene dos campos numéricos. Hay dos posibilidades ilustradas a continuación.




La situación de la izquierda se comoce como copiado de memoria y a la segunda copiado de referencia. La que sucede es la segunda. Java tiene un recolector de basura dinámico que reclamará el espacio al cual v1 ya no hace referencia si es que no existe otra referencia a este.
Así que Java si tiene un tipo de apuntadores o, mejor dicho, referencias. Lo que no tiene es operadores que haya que poner explícitamente como *, ^ o &&; ni le da al programador(a) la capacidad de manipularlos con operaciones aritméticas o de otro tipo como en C.

Ejemplo:

Una de las operaciones que se conoce es anadir un nodo al comienzo de una lista ligada. Suponga que ptr apunta al node de la lista despues del cual se añadirá un nuevo nodo. La clase se definió así:
class listaLigada {
   int m,n;
   listaLigada prox;

   // declaraciones de metodos aqui
   ...
}
Las variables ptr y qtr se definió
listaLigada ptr;
Un pedazo de código que anade un uevo nodo despues de ptr es:
qtr = new listaLigada();
// se llenan los campos de la lista ligada
...
qtr.prox = ptr.prox;
ptr.prox = qtr;
// Listo!

No hay comentarios:

Publicar un comentario