En Java, les paramètres sont passés en référence ou en valeur ?

Dans les langages informatiques récents, il existe deux manières de passer un argument dans une fonction, le passage par valeur et le passage par référence.

Bien que l'on parle de références dans le langage Java, les variables sont systématiquement transmises par valeur. Lorsqu'une variable est transmise par valeur à une fonction, c'est en fait un pointeur vers son adresse mémoire qui est transmis. Lorsque l'on crée une variable a, cette variable contient en réalité l'emplacement de l'objet créé dans la mémoire.

maClasse a = new maClasse();
a.nom = Jean;

Si l'on transmet cet objet à une fonction, elle reçoit l'adresse où il est stocké en mémoire. Lorsque que l'on modifie l'objet, le traitement associé en arrière-plan consiste à créer un nouveau pointeur vers l'adresse en mémoire transmise, puis à modifier l'attribut stocké à cet emplacement.

function test(maClasse a)
{
 a.nom = Paul; //Un nouveau pointeur vers l'emplacement en mémoire est créé puis l'attribut est modifié
}
test(a);
System.out.println(a.nom) //Cela affichera Paul.

Si dans la fonction, on déclare à nouveau la variable a pour ensuite changer la valeur de l'attribut, alors on crée un pointeur vers un nouvel emplacement en mémoire, puis on modifie la valeur de l'attribut dans cet emplacement. Cela ne modifie donc pas la valeur de l'attribut de notre objet.

function test(maClasse a)
{
 a = new maClasse(); //La variable a contient un pointeur vers un nouvel emplacement en mémoire.
 a.nom = Paul; //La valeur de l'attribut stocké dans le nouvel emplacement est modifiée
}
test(a);
System.out.println(a.nom) //Cela affichera Paul car la valeur n'a pas été modifiée.

A l'inverse, cette méthode fonctionnerait dans un langage où les variables peuvent être transmises en référence.

Java