¡Java es estrictamente pasar por valor!

Considere el siguiente programa Java que pasa un tipo primitivo a la función. 

Java

public class Main
{
    public static void main(String[] args)
    {
        int x = 5;
        change(x);
        System.out.println(x);
    }
    public static void change(int x)
    {
        x = 10;
    }
}

Producción:

5

Pasamos un int a la función “cambio()” y como resultado el cambio en el valor de ese entero no se refleja en el método principal. Al igual que C/C++, Java crea una copia de la variable que se pasa en el método y luego realiza las manipulaciones. Por lo tanto, el cambio no se refleja en el método principal.

¿Qué hay de los objetos o las referencias?

En Java, todas las primitivas como int, char, etc. son similares a C/C++, pero todas las no primitivas (u objetos de cualquier clase) son siempre referencias. Entonces se vuelve complicado cuando pasamos referencias de objetos a métodos. Java crea una copia de las referencias y la pasa al método, pero aún apuntan a la misma referencia de memoria. Significa que si establece algún otro objeto para hacer referencia al método pasado dentro, el objeto del método de llamada y su referencia no se verán afectados. Los cambios no se reflejan si cambiamos el objeto en sí para hacer referencia a otra ubicación u objeto . Si asignamos una referencia a otra ubicación, los cambios no se reflejan en main(). 

Java

// A Java program to show that references are also passed
// by value.
class Test
{
    int x;
    Test(int i) { x = i; }
    Test()      { x = 0; }
}
 
class Main
{
    public static void main(String[] args)
    {
        // t is a reference
        Test t = new Test(5);
 
        // Reference is passed and a copy of reference
        // is created in change()
        change(t);
 
        // Old value of t.x is printed
        System.out.println(t.x);
    }
    public static void change(Test t)
    {
        // We changed reference to refer some other location
        // now any changes made to reference are not reflected
        // back in main
        t = new Test();
 
        t.x = 10;
    }
}

Producción:

5

Los cambios se reflejan si no asignamos una referencia a una nueva ubicación u objeto: si no cambiamos la referencia para hacer referencia a otro objeto (o ubicación de memoria), podemos realizar cambios en los miembros y estos cambios se reflejan nuevamente. 

Java

// A Java program to show that we can change members using
// reference if we do not change the reference itself.
class Test
{
    int x;
    Test(int i) { x = i; }
    Test()      { x = 0; }
}
 
class Main
{
    public static void main(String[] args)
    {
        // t is a reference
        Test t = new Test(5);
 
        // Reference is passed and a copy of reference
        // is created in change()
        change(t);
 
        // New value of x is printed
        System.out.println(t.x);
    }
 
    // This change() doesn't change the reference, it only
    // changes member of object referred by reference
    public static void change(Test t)
    {
        t.x = 10;
    }
}

Producción:

10

Ejercicio: predecir la salida del siguiente programa Java 

Java

//  Test.java
class Main {
   // swap() doesn't swap i and j
   public static void swap(Integer i, Integer j)
   {
      Integer temp = new Integer(i);
      i = j;
      j = temp;
   }
   public static void main(String[] args)
   {
      Integer i = new Integer(10);
      Integer j = new Integer(20);
      swap(i, j);
      System.out.println("i = " + i + ", j = " + j);
   }
}

Este artículo es una contribución de Pranjal Mathur . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo electrónico a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *