Aclaracion de duda sobre concepto de referencia

Hola
Soy nueva en el foro, estoy estudiando para una certificacion OCJA, y me surgio una duda de concepto que ojala ustedes me pudieran resolver.
He leido que el paso de parametros a un metodo puede ser por valor o referencia, siendo los primitivos por valor, y los objetos por referencia

se que cuando el paso es por valor, se hace una copia de la variable (o valor de la variable) y por lo tanto cuando se sale del metodo, el valor original de la variable no fue afectado, sin embargo cuando se pasa un objeto, el valor de la variable SI se ve afectado en todo momento.

Se me ocurrio entonces que podia pasar a un metodo, una variable tipo Integer, porque finalmente es una variable int envuelta en formato objeto, sin embargo para mi sorpresa.. al salir del metodo, veo que la variable imprime el valor original, como si se tratase de un primitivo...

Me podrian decir porque pasa esto??

Anexo mi pedacito de codigo para ejemplificar mejor
Gracias

Integer valor = new Integer(1);
System.out.println("Argument: value = " + valor);
addfour(valor);
System.out.println("After method call: value = " + valor);

--------------------------------------------------------------------------------

private static void addfour(Integer valor){
Integer valor4 = new Integer(4);
System.out.println("Parameter: value = " + valor);
valor = (valor + valor4);
System.out.println("Leaving method: value = " + valor);
}

The output is :
Argument: value = 1
Parameter: value = 1
Leaving method: value = 5
After method call: value = 1

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

En Java el paso de parametros

En Java el paso de parametros siempre es por valor, siempre, siempre, siempre.

Sucede que cuando el parametro no es un primitivo el valor que se pasa es el valor de la referencia, pero nunca la referencia como tal; en java esto no es posible.

Para una discusión más larga y detallada ve este post:

http://www.javamexico.org/foros/java_standard_edition/envio_y_recepcuion...

Saludos

Imagen de bferro

Integer es inmutable

Lo que sucede en tu código en la línea:

valor = valor +valor4;

es realmente:

valor = new Integer(valor.intValue() +valor4.intValue());

Dentro del método, la referencia valor externa, fue copiada a la referencia valor local a ese método, que dentro del método se refiere ahora a otro objeto creado, como puedes observar en el código.

Imagen de Perla

Gracias

Quedo mas claro... gracias

Imagen de Perla

Gracias por el link

Gracias por la liga... fue de mucha ayuda =)

Resucitando el tema (¬¬ creo que ya van dos)

mmm, entonces alguien me pudiera explicar que es lo que pasa con el método sort de la clase Arrays (java.util.Arrays), que cuando uno le pide ordenar una lista no regresa una ordenada. En realidad sin usar referencias no me explico como funciona esto:

import java.util.Arrays;

class Cosa{
        public static void main(String ... args){
                int[] arreglo = new int[]{9,5,3,12,4,7,20,3,45,6};
                //Vamos a imprimirlo en desorden:
                for(int i : arreglo) System.out.println(i);
                //Separamos orden de desorden
                System.out.println("============================");
                //Lo ordenamos:
                Arrays.sort(arreglo);
                //Lo imprimimos ordenado:
                for(int i : arreglo) System.out.println(i);
        }
}

¿Alguien me pudiera explicar porqué si Arrays.sort() no regresa otra lista y si en Java no hay uso de referencias, como es que arreglo se comportó como una referencia?

Imagen de bferro

Pasas el valor de la referencia

Hay varios posts que aclaran el problema del paso de parámetros en Java y otros lenguajes. Cuando decimos que el paso es por valor, es que los argumentos "son recibidos" por variables locales del método invocado. Si lo que pasas es el valor de un tipo primitivo, entonces la variable local toma ese valor; si lo que pasas es el valor de una referencia (en esencia un apuntador), entonces la variable local toma el valor de esa referencia.
Si modificas en el método mediante esa referencia local al objeto, estás modificando el objeto original, pero si esa variable referencia local toma otro valor, entonces ya no modificas el objeto original, a través de esa referencia.

Imagen de JavaSam

Estudio para examen

Hola! yo también soy nuevo aquí :-)

¿Ya hiciste el exámen?
Te comento que el mes pasado realicé la certificación OCJA después de haber tenido de guía por unos meses el libro de McGraw Hill para esta certificación, este libro cubre todos los temas vistos en el exámen, si es que no lo estás utilizando para estudiar, te puedo mandar una copia en pdf por correo si gustas, lo considero bastante útil :-)

Libro para certificación

Eeeh tio, me me puedes pasar el libro, mi correo es marcosroberto.openbsoft@gmail.com

Desde ya muchas gracias. Saludos