Clases de envoltura y llamada por referencia en java

A continuación se muestra mi código:

class Demo{ public static void main(String[] args) { Integer i = new Integer(12); System.out.println(i); modify(i); System.out.println(i); } private static void modify(Integer i) { i= i + 1; System.out.println(i); } 

}

La SALIDA del CÓDIGO anterior es 12 12 pero, como sé, estamos pasando el objeto de envoltura “i”, significa que debe ser “Llamada por referencia”, entonces el valor debería cambiar a 13. pero su 12. Cualquiera tiene explicación adecuada para esto?

Las referencias se pasan por valor y, además de eso, Integer es inmutable .

Cuando se pasa i al método, se pasa el valor de la referencia (la referencia es local a ese método) y cuando se le asigna otro objeto, solo se modifica esa referencia / variable local que contiene la referencia. El original se mantiene sin cambios.

Inmutable significa que un objeto una vez creado / instanciado ya no es posible cambiar su estado.

Esta línea de código en el método de modify :

  i= i + 1; 

está operando en un Integer , no en un int . Hace lo siguiente:

  1. unbox i a un valor int
  2. agrega 1 a ese valor
  3. caja el resultado en otro objeto Integer
  4. asigne el Integer resultante a i (cambiando así a qué objeto i referencia)

Dado que las referencias de objetos se pasan por valor, la acción realizada en el método de modify no cambia la variable que se usó como un argumento en la llamada a modify . Por lo tanto, la rutina principal seguirá imprimiendo 12 después de que el método regrese.

Si quisiera cambiar el objeto en sí, tendría que pasar un objeto mutable (como han mencionado otros, Integer es inmutable) y tendría que llamar a un método mutador o modificar directamente un campo. Por ejemplo:

 class Demo{ static class IntHolder { private int value; public IntHolder(int i) { value = i; } public IntHolder add(int i) { value += i; return this; } public String toString() { return String.valueOf(value); } } public static void main(String[] args) { IntHolder i = new IntHolder(12); System.out.println(i); modify(i); System.out.println(i); } private static void modify(IntHolder i) { i.add(1); System.out.println(i); } } 

Las clases de envoltura son inmutables, por lo que las operaciones como la sum y la resta crean un nuevo objeto y no modifican el antiguo.

Si desea pasar una primitiva por referencia, una forma de hacerlo es pasar una única matriz de elementos:

 int[] i= new int[1]{12}; ... private static void modify(int[] i) { i[0]= i[0] + 1; System.out.println(i[0]); } 

Java siempre es pasar-por-valor. Lo difícil puede ser comprender que Java pasa los objetos como referencias y esas referencias se pasan por valor.

Echale un vistazo:

¿Es Java “paso por referencia” o “paso por valor”?

verifique mi eclipse y obtenga la salida 12 13 12. El método de modificación paso por valor 12, luego i= i + 1; añade uno el.

 package com.demo.swain; public class Demo { public static void main(String[] args) { Integer i = new Integer(12); System.out.println(i); modify(i); System.out.println(i); } private static void modify(Integer i) { i= i + 1; System.out.println(i); } } Output:12 13 12 

introduzca la descripción de la imagen aquí Estoy hablando fuertemente este código no da salida 12, 12.