Diferentes formas de lograr pasar por referencia en Java

Hay dos tipos de parámetros, uno son los parámetros formales y el segundo son los parámetros reales . Los parámetros formales son aquellos parámetros que se definen durante la definición de la función y los parámetros reales son aquellos que se pasan durante la llamada de función en otra función.

Mostrando los parámetros formales y reales a través del código:

Java

// Java program to show the difference
// between formal and actual parameters
 
import java.io.*;
 
class GFG {
  static int sum(int a,int b) // Formal parameters
  { 
   return a+b;
  }
    public static void main (String[] args) {
       int a=5;
       int b=10;
       
      System.out.println(sum(a,b));  //This is actual parameters
    }
}
Producción

15
  • Las funciones se pueden diferenciar sobre la base de parámetros.
  • Y hay dos formas de pasar los parámetros en las funciones: llamar por valor y c todo por referencia .
  • C/C++ admite la llamada por referencia porque en la llamada por referencia pasamos la dirección de los parámetros reales en lugar de los parámetros formales mediante Punteros.
  • Y Java no admite punteros, es por eso que Java no admite llamadas por referencia, pero c/c++ admite punteros, por lo tanto, estos lenguajes admiten llamadas por referencia.
Swapping of Two numbers in C/C++ language is done by the call by Reference approach

A continuación se muestra la implementación de Call by Reference en C

C

// C program o show the call by reference support
 
#include <stdio.h>
 
// formal parameters
void swap(int* x, int* y)
{
 
    int temp;
   
    // save the value at address x
    temp = *x;
   
    // put y into x
    *x = *y;
   
    // put temp into y
    *y = temp;
 
    return;
}
int main()
{
    int a = 15;
    int b = 5;
    printf("Value of a %d\n", a);
    printf("Value of b %d\n", b);
 
    // swapping the value using call by reference
    swap(&a,&b);
 
    printf("Value of a %d\n", a);
 
    printf("Value of b %d", b);
     
    return 0;
}
Producción

Value of a 15
Value of b 5
Value of a 5
Value of b 15

En Java, si intentamos intercambiar números en Java, los cambios en el estado de los dos números son válidos solo en el método de intercambio particular. 

Intercambiar dos números en java:

Java

// Java program to swap two numbers
 
import java.io.*;
 
class GFG {
    static void swap(int a, int b)
    {
        int temp = a;
 
        a = b;
 
        b = temp;
 
        System.out.println("Value of a in swap function "
                           + a);
 
        System.out.println("Value of b in swap function "
                           + b);
        return;
    }
 
    public static void main(String[] args)
    {
        int a = 5;
        int b = 10;
       
        // original value of a
        System.out.println("Value of the a "
                           + a);
         
        // original value of b
        System.out.println("Value of the b "
                           + b);
 
        // swap the numbers
        swap(a, b);
 
        System.out.println("Value of the a " + a);
 
        System.out.println("Value of the b " + b);
    }
}
Producción

Value of the a 5
Value of the b 10
Value of a in swap function 10
Value of b in swap function 5
Value of the a 5
Value of the b 10

Hay algunas formas de lograr pasar por referencia en Java en lugar de la llamada por referencia: 

1. Hacer una variable particular de un tipo de datos particular como miembro de clase

  • Se puede acceder a un miembro de la clase a través de la definición de la clase y podemos acceder a los miembros usando esta palabra clave cuando hay una variable local que tiene el mismo nombre que el nombre del miembro de la clase presente en el cuerpo de la función en particular o en la definición de la función para evitar confusiones.
  • Para pasar la referencia, pasamos el objeto de la clase en lugar del parámetro real y el parámetro formal de un tipo de objeto de clase tiene la misma referencia entre sí, por eso con la ayuda del objeto de parámetro formal de clase cualquier los cambios se verán reflejados tanto en los objetos formales como en los objetos reales.

Java

// Java program to make a particular variable
// of a particular datatype as a class member
 
import java.io.*;
 
class GFG {
    int Number;
    void GFG() { Number = 0; }
 
    static void update(GFG ob) { ob.Number++; }
 
    public static void main(String[] args)
    {
        GFG ob = new GFG();
 
        System.out.println("Number value " + (ob.Number));
 
        update(ob);
 
        System.out.println("Updated Number value "
                           + (ob.Number));
    }
}
Producción

Number value 0
Updated Number value 1

2. Pasar colecciones o array de un solo elemento como parámetro: 

  • Podemos pasar colecciones como ArrayList, stack, etc. o una array de un solo elemento como parámetros reales, y tanto los parámetros reales como los formales de la función tienen la misma referencia a la dirección de memoria.

Java

// Java program to passing collections
// as parameters
 
import java.io.*;
import java.util.*;
 
class GFG {
    static void update(int a[])
    {
        // formal parameter
        a[0]++;
    }
 
    static void update2(ArrayList<Integer> A)
    {
        for (int i = 0; i < A.size(); ++i) {
 
            // update the item of
            // the arraylist
            A.set(i, A.get(i) + 1);
        }
    }
    public static void main(String[] args)
    {
        // using single array of element
        int a[] = new int[1];
 
        System.out.println("Number Value " + a[0]);
 
        // actual parameter
        update(a);
 
        System.out.println("Number Value " + a[0]);
 
        // using Arraylist collection
        ArrayList<Integer> A = new ArrayList<>();
 
        A.add(1);
        A.add(2);
 
        System.out.println("List " + A);
 
        // actual parameter
        update2(A);
 
        System.out.println("Updated List " + A);
    }
}
Producción

Number Value 0
Number Value 1
List [1, 2]
Updated List [2, 3]

3. Actualice el valor de retorno:  

  • Enfoque ingenuo para realizar una referencia simplemente actualizando el valor de retorno con el valor anterior. 

Java

// Java program to show the return
// value getting updated
 
import java.io.*;
 
class GFG {
    static int update(int number)
    {
        // update the number
        return ++number;
    }
 
    public static void main(String[] args)
    {
        int number = 3;
 
        // printing the number
        System.out.println("Number " + number);
 
        int returnnumber = update(number);
 
        // update the number
        number = returnnumber;
 
        // printing the updated number;
        System.out.println("Updated number " + number);
    }
}
Producción

Number 3
Updated number 4

Publicación traducida automáticamente

Artículo escrito por zack_aayush 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 *