Passer par référence en Java

Aryan Tyagi 12 octobre 2023
Passer par référence en Java

Un pointeur est une variable dans l’architecture du langage de programmation qui surveille implicitement l’adresse de données spécifiques. L’équivalent d’une autre variable s’appelle une référence. Toute modification apportée à la variable de référence a un impact direct sur l’original.

Java est un langage de passage par valeur. Il précise ainsi lui-même dans ses spécifications qu’il n’a jamais été un langage de référence. En Java, il existe une grande confusion entre les deux termes en raison de la nature ambiguë des références. Nous allons essayer de l’éclaircir dans cet article.

Parlons du passage par valeur. Ici, la valeur d’un paramètre formel est copiée dans un emplacement utilisé pour le stocker pendant l’exécution de la méthode/fonction. Cet emplacement a généralement une partie de la mémoire allouée à cette fin.

Dans le passage par référence, la valeur d’un paramètre formel est copiée dans un emplacement utilisé pour le stocker pendant l’exécution de la méthode/fonction. Cet emplacement a généralement une partie de la mémoire allouée à cette fin.

Java est présenté comme un langage robuste et sécurisé, et l’un des avantages de Java est qu’il n’autorise pas un pointeur comme C++. Ils ont même choisi un terme différent pour la notion, les qualifiant officiellement de “références”.

La clé pour comprendre cela est de considérer quelque chose comme

Object Obj;

C’est un pointeur vers l’Object, pas un Obj. Le terme référence est mal compris en Java et est la source de la plupart des confusions. Dans d’autres langages de programmation, ce qu’ils appellent des références fonctionnent comme des pointeurs.

Lorsque nous parlons d’objets en Java, nous parlons de descripteurs d’objets appelés références, qui sont également fournis par value.

Dans le code ci-dessus, vous envoyez effectivement l’adresse Object construite à la méthode.

Java est similaire au C en ce sens qu’il s’agit d’un langage procédural. Vous pouvez affecter un pointeur à une méthode, l’y envoyer, le tracer à l’intérieur de la méthode et modifier les données vers lesquelles il pointait. En revanche, tout changement que vous apportez à la position du pointeur ne sera pas remarqué par l’appelant. (Dans un langage de référence, la fonction de méthode peut changer le pointeur sans que l’appelant s’en rende compte.)

Considérez les paramètres de référence à substituer aux variables transmises. La variable que nous avons transmise est affectée lorsque cet alias est affecté.

Comprenons mieux cela avec deux situations.

Si nous modifions l’objet lui-même et le pointons vers un autre endroit ou objet, les changements ne sont pas reflétés. Les changements ne seront pas reflétés dans la fonction main() si nous avons donné la référence à un endroit différent.

Voir le code ci-dessous.

class Object {
  int x;
  Object(int z) {
    x = z;
  }
  Object() {
    x = 0;
  }
}

class Main {
  public static void main(String[] args) {
    // a reference
    Object O = new Object(7);

    // Reference passed and copy created in change()
    change(O);

    // old value
    System.out.println(O.x);
  }
  public static void change(Object O) {
    // reference changed to some other location any changes not reflected
    O = new Object();

    O.x = 8;
  }
}

Production:

7

Maintenant, supposons que nous n’attribuions pas de référence à un nouveau lieu ou objet. Dans ce cas, les résultats sont renvoyés en miroir : vous pouvez apporter des modifications aux membres. Ces changements sont reflétés si nous ne modifions pas la référence pour faire référence à un autre objet (ou emplacement mémoire).

Par exemple,

class Object {
  int x;
  Object(int z) {
    x = z;
  }
  Object() {
    x = 0;
  }
}

class Main {
  public static void main(String[] args) {
    // a reference
    Object O = new Object(7);

    // Reference passed and copy created in change()
    change(O);

    // old value
    System.out.println(O.x);
  }
  public static void change(Object O) {
    O.x = 8;
  }
}

Production:

8