Pasar por referencia en Java
Un puntero es una variable en la arquitectura del lenguaje de programación que monitorea implícitamente la dirección de datos específicos. Un equivalente de otra variable se llama referencia. Cualquier modificación realizada a la variable de referencia tiene un impacto directo en el original.
Java es un lenguaje de paso por valor. Lo mismo dice en sus especificaciones que nunca fue un lenguaje de paso por referencia. En Java, existe mucha confusión entre los dos términos debido a la naturaleza ambigua de las referencias. Intentaremos aclararlo en este artículo.
Analicemos el paso por valor. Aquí, el valor de un parámetro formal se copia en una ubicación utilizada para almacenarlo durante la ejecución del método / función. Esta ubicación normalmente tiene una porción de memoria asignada para ese propósito.
En el paso por referencia, el valor de un parámetro formal se copia en una ubicación que se utiliza para almacenarlo durante la ejecución del método / función. Esta ubicación normalmente tiene una porción de memoria asignada para ese propósito.
Java se promociona como un lenguaje robusto y seguro, y uno de los beneficios de Java es que no habilita punteros como C++. Incluso eligieron un término diferente para la noción, refiriéndose oficialmente a ellos como “referencias”.
La clave para comprender esto es considerar algo como
Object Obj;
Es un puntero al Object
, no un Obj
. El término referencia se entiende mal en Java y es la fuente de la mayor parte de la confusión. En otros lenguajes de programación, lo que ellos llaman referencias funcionan como punteros.
Cuando hablamos de objetos en Java, estamos hablando de identificadores de objetos llamados referencias, que también se proporcionan por valor.
En el código anterior, está enviando efectivamente la dirección de Objeto
construida al método.
Java es similar a C en que es un lenguaje de procedimiento. Puede asignar un puntero a un método, enviarlo allí, rastrearlo dentro del método y cambiar los datos a los que apuntó. Cualquier cambio que realice en la posición del puntero, por otro lado, pasará desapercibido para la persona que llama. (En un lenguaje de paso por referencia, la función de método puede cambiar el puntero sin que la persona que llama se dé cuenta).
Considere la posibilidad de sustituir los parámetros de referencia por variables pasadas. La variable que pasamos se asigna cuando se asigna ese alias.
Entendamos esto mejor con dos situaciones.
Si modificamos el objeto en sí y lo apuntamos a otro lugar u objeto, los cambios no se reflejan. Los cambios no se reflejarán en la función main()
si le hemos dado la referencia a un lugar diferente.
Vea el código a continuación.
class Object {
int x;
Object(int z) {
x = z;
}
Object() {
x = 0;
}
}
class Main {
public static void main(String[] args) {
// a reference
Object O = new Object(7);
// Reference passed and copy created in change()
change(O);
// old value
System.out.println(O.x);
}
public static void change(Object O) {
// reference changed to some other location any changes not reflected
O = new Object();
O.x = 8;
}
}
Producción :
7
Ahora, supongamos que no asignamos una referencia a un nuevo lugar u objeto. En ese caso, los resultados se reflejan: puede realizar modificaciones en los miembros. Estos cambios se reflejan si no modificamos la referencia para hacer referencia a otro objeto (o ubicación de memoria).
Por ejemplo,
class Object {
int x;
Object(int z) {
x = z;
}
Object() {
x = 0;
}
}
class Main {
public static void main(String[] args) {
// a reference
Object O = new Object(7);
// Reference passed and copy created in change()
change(O);
// old value
System.out.println(O.x);
}
public static void change(Object O) {
O.x = 8;
}
}
Producción :
8