L'appel de la méthode par est un terme informatique standard. Les appels de méthode sont divisés en appels de valeur (appel par référence) et appels de référence (appel par valeur) en fonction de la situation de passage des paramètres. Il existe de nombreuses définitions de ces deux types d'appels dans le monde. Le dicton le plus courant est que la valeur est l'appel de valeur et que l'adresse est l'appel de référence. C'est en fait très inapproprié. Ces instructions peuvent facilement nous rappeler que le passage du paramètre d'objet de Java est un appel de référence. En fait, le passage du paramètre d'objet de Java est toujours un appel de valeur.
Utilisons d'abord un morceau de code pour confirmer pourquoi le passage des paramètres de l'objet Java est un appel de valeur.
Employé de classe publique {public String name = null; Employé public (String n) {this.name = n; } // échanger deux objets d'employé Swap de vide statique public (employé E1, employé E2) {employé temp = e1; e1 = e2; e2 = temp; System.out.println (e1.name + "" + e2.Name); // Résultat d'impression: li si zhang san} // fonction principale public static void main (String [] args) {employé Worker = New Employee ("Zhang SAN"); Employee Manager = New Employee ("Li SI"); Swap (travailleur, directeur); System.out.println (Worker.Name + "" + Manager.name); // Le résultat de l'impression est toujours: Zhang San Li si}}Le résultat ci-dessus est très décevant. Bien que le contenu des objets de paramètre formels E1 et E2 ait été échangé, le travailleur et le gestionnaire des objets de paramètre réels n'ont pas échangé le contenu. La raison la plus importante ici est que les paramètres formels E1 et E2 sont les copies d'adresse des paramètres réels du travailleur et du gestionnaire.
Comme nous le savons tous, en Java, les noms de variables d'objet représentent en fait l'adresse de l'objet dans le tas (le terme professionnel est appelé référence d'objet). Lorsque la méthode Java est appelée, les paramètres transmettent une référence à l'objet. Surtout, les adresses de mémoire occupées par les paramètres formels et les paramètres réels ne sont pas les mêmes. Le contenu dans les paramètres formels n'est qu'une copie de la référence d'objet stockée dans les paramètres réels.
Si vous comprenez la zone variable locale de la pile Java dans la gestion de la mémoire JVM (voir "Java Virtual Machine Architecture"), vous comprendrez très bien la phrase ci-dessus. Lorsque le JVM exécute le programme ci-dessus, l'exécution de la méthode principale et la méthode d'échange pousse deux espaces de mémoire appelées cadres de pile dans la pile Java. Il y a un morceau de mémoire appelé zone variable locale dans le cadre de pile principal pour stocker des références au travailleur et gestionnaire d'objets de paramètre réels. La zone variable locale dans le cadre de pile d'échange stocke des références aux objets de paramètre formels E1 et E2. Bien que les valeurs de référence de E1 et E2 soient les mêmes que celles du travailleur et du gestionnaire, ils occupent un espace mémoire différent. Lorsque les références entre E1 et E2 sont échangées, la figure ci-dessous montre clairement qu'elle n'affectera pas du tout les valeurs de référence du travailleur et du gestionnaire.
Le passage des paramètres de l'objet Java est toujours un appel de valeur bien que l'adresse (référence) soit passé. Il est temps de donner l'appel de référence et l'appel de valeur une définition précise.
Appel par valeur: Pendant le processus de passage des paramètres, les paramètres formels et les paramètres réels occupent deux espaces de mémoire complètement différents. Le contenu stocké par le paramètre formel est une copie du contenu stocké par le paramètre réel. En fait, le passage des objets Java répond à cette définition, sauf que le contenu stocké par des paramètres formels et des paramètres réels n'est pas la valeur variable au sens conventionnel, mais l'adresse de la variable. Eh bien, réfléchissez: l'adresse d'une variable n'est-elle pas également une valeur?
Appel par référence: Pendant le processus de passage des paramètres, les paramètres formels et les paramètres réels sont complètement le même espace mémoire, et les deux ne se distinguent pas les uns des autres. En fait, les noms de paramètres formels et les noms de paramètres réels ne sont que des symboles différents dans la programmation. Pendant le fonctionnement du programme, l'espace stocké en mémoire est la chose la plus importante. Différents noms de variables n'indiquent pas l'espace de stockage de mémoire occupée différemment.
De manière générale, les bases des deux appels ne sont pas si la valeur ou l'adresse est passée (après tout, l'adresse est également une valeur), mais si les paramètres formels et les paramètres réels occupent le même espace mémoire. En fait, le paramètre du pointeur qui passe en C / C ++ est également un appel de valeur. Si vous ne le croyez pas, essayez le code C suivant!
#include <stdio.h> VOID Swap (int * a1, int * b1) {int * t = a1; a1 = b1; b1 = t; } int main () {int x1 = 100; int x2 = 200; int * a = & x1; int * b = & x2; printf ("% d% d / n", * a, * b); échange (a, b); printf ("% d% d / n", * a, * b); retour 0; }Mais C / C ++ a des appels de référence, qui est une méthode de déclaration variable appelée référence int a; int & ra = a; où ra est un alias de a. Il n'y a pas de différence entre les deux en mémoire et occupent le même espace mémoire. Le passage des paramètres par référence (alias) est conforme aux caractéristiques des appels de référence. Vous pouvez essayer les résultats en cours d'exécution de Void Swap (int & a1, int & b1);
Grâce à cet article, vous devez savoir si les paramètres de la méthode Java sont appelés référence ou valeur.