¿Java admite el paso de variables por referencia?

publicado por: Anonymous

Cuando yo paso un objeto a un método mediante un parámetro, el objeto se pasa por valor o referencia? La duda viene por este código:

int a = 2;
cambiar(a);
System.out.println(a);

public static void cambiar(int c) {
    c = 10;
}

En el código anterior ya sabía que no iba a modificar a a en ningún aspecto a menos que el método devolviera un int y lo guardara. ¿Pero en el siguiente código que ocurre?

class otraCualquiera {
    Partidas partidas = new Partidas();
    Ventana ventana = new Ventana();
    Gestor gestor = new Gestor(ventana,partidas);
}

class culquiera {
    private Ventana view;
    private Partidas play;

    public Gestor(Ventana v, Partidas p) {
        view = v;
        play = p;
    }
}

La duda principal, porque desde la clase cualquiera puedo moficicar directamente a las otras clases? ( view.setTitle("View sería un jframe") ) y desde el primer código que mostré no puedo modificar el int?

solución

Antes de nada…

En Java no existe el paso por referencia. El paso por valor (o por copia como algunos llaman) es obligatorio.

Dirás pero yo cuando paso un array por parámetros y lo modifico desde el método al que se lo paso, este cambia, no estoy pasando una copia del array

Parece ser que mi argumento falla, pero te explico:

Lo que tú almacenas en una variable no primitiva no es el objeto en sí sino una dirección o identificador del objeto en el espacio dinámico de memoria. Cuando pasas por parámetros la variable, estás pasando una copia de dicha dirección.

El caso que has propuesto

Has creado tres objetos del tipo Partidas, Ventana y Gestor.

El objeto Gestor almacena en sus atributos la dirección de los objetos Partidas y Ventana que les has pasado por parámetros. No se ha creado una copia de los objetos pasados.

Lo que sí tienes es una copia de la dirección de los objetos. Si tú añades la siguiente línea al constructor de Gestor justo tras las que ya tienes:

v = null;

Sólo harás que el parámetro v ya no almacene la dirección del objeto del tipo Ventana. En la clase otraCualquiera, la variable ventana seguirá teniendo la dirección correcta.

Por tanto, el paso ES SIEMPRE por copia del valor, a diferencia de, por ejemplo, C o C++, donde se permite el paso por referencia. Lo que tienes que entender es que en caso de objetos el valor que almacena una variable es una dirección o identificador del objeto y no el objeto en sí mismo.


Si lo que quieres es encontrar una forma de poder modificar una variable de tipo primitivo (como un int) desde otro método al que se la pasas (algo no muy común, pero útil en algunos algoritmo recursivos), una técnica podría ser tener el entero como un array de un solo elemento, así se trataría como un objeto y solo pasarías una copia de su dirección (una referencia en toda regla).

El pensamiento habitual es almacenarlo como objeto Integer, pero esta clase es inmutable.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *