Maison >Java >javaDidacticiel >Les paramètres de la méthode Java sont-ils appelés par référence ou par valeur ?

Les paramètres de la méthode Java sont-ils appelés par référence ou par valeur ?

高洛峰
高洛峰original
2017-01-22 10:59:531557parcourir

L'appel de méthode (call by) 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 des paramètres passés. Il existe de nombreuses définitions de ces deux types d'appels dans le monde. Le dicton le plus courant est que celui qui transmet la valeur est un appel de valeur et celui qui transmet l'adresse est un appel de référence. C'est en fait très inapproprié. Ces instructions nous rappellent facilement que le passage de paramètres d'objet de Java est un appel de référence. En fait, le passage de paramètres 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 d'objet Java est appelé par valeur.

public class Employee {
 
  public String name=null;
 
  public Employee(String n){
    this.name=n;
  }
  //将两个Employee对象交换
  public static void swap(Employee e1,Employee e2){
    Employee temp=e1;
    e1=e2;
    e2=temp;
        System.out.println(e1.name+" "+e2.name); //打印结果:李四 张三
  }
  //主函数
  public static void main(String[] args) {
    Employee worker=new Employee("张三");
    Employee manager=new Employee("李四");
    swap(worker,manager);
    System.out.println(worker.name+" "+manager.name); //打印结果仍然是: 张三 李四
  }
}

Le résultat ci-dessus est très décevant. Bien que le contenu des objets paramètres formels e1 et e2 ait été échangé, les objets paramètres réels travailleur et gestionnaire ont été échangés. pas. Échangez du contenu. La raison la plus importante ici est que les paramètres formels e1 et e2 sont des copies d'adresse des paramètres réels du travailleur et du gestionnaire.

Comme nous le savons tous, le nom de la variable objet en Java représente en fait l'adresse de l'objet dans le tas (le terme technique est appelé référence d'objet). Lorsqu'une méthode Java est appelée, le paramètre passé est une référence à l'objet. L'important est que les adresses mémoire occupées par les paramètres formels et les paramètres réels ne sont pas les mêmes. Le contenu des 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 savez quelque chose sur la zone de variables locales de la pile Java dans la gestion de la mémoire JVM (voir "Architecture de la machine virtuelle Java"), vous pouvez facilement comprendre la phrase ci-dessus. Lorsque la JVM exécute le programme ci-dessus, l'exécution de la méthode main et de la méthode swap poussera deux espaces mémoire appelés cadres de pile dans la pile Java. Il y a un morceau de mémoire appelé zone de variable locale dans le cadre de pile principal pour stocker les références aux objets paramètres réels, travailleur et gestionnaire. La zone de variables locales dans le cadre de la pile d'échange stocke les références aux objets paramètres formels e1 et e2. Bien que les valeurs de référence de e1 et e2 soient respectivement les mêmes que celles du travailleur et du manager, elles occupent des espaces mémoire différents. Lorsque les références de e1 et e2 sont échangées, la figure ci-dessous montre clairement que les valeurs de référence de l'ouvrier et du manager ne seront pas du tout affectées.

Les paramètres de la méthode Java sont-ils appelés par référence ou par valeur ?

Bien que le passage du paramètre d'objet Java transmette une adresse (référence), il s'agit toujours d'un appel de valeur. Il est temps de donner une définition précise de l'appel par référence et de l'appel par valeur.

Appel par valeur : lors du processus de passage des paramètres, les paramètres formels et les paramètres réels occupent deux espaces mémoire complètement différents. Le contenu stocké dans le paramètre formel est une copie du contenu stocké dans le paramètre réel. En fait, le transfert d'objets Java est conforme à cette définition, sauf que le contenu stocké dans les paramètres formels et les paramètres réels n'est pas la valeur de la variable au sens conventionnel, mais l'adresse de la variable. Toussez, repensez-y et réfléchissez-y : l’adresse d’une variable n’est-elle pas aussi une valeur ?

Appel par référence : dans le processus de transfert de paramètres, les paramètres formels et les paramètres réels sont complètement dans le même espace mémoire, et ils ne sont pas séparés 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. Lors de l'exécution du programme, l'espace de stockage dans la mémoire est le plus important. Des noms de variables différents ne signifient pas que l’espace de stockage mémoire occupé est différent.

D'une manière générale, la différence fondamentale entre les deux appels n'est pas de savoir si la valeur ou l'adresse est transmise (après tout, l'adresse est aussi une valeur), mais si les paramètres formels et les paramètres réels occupent la même mémoire espace. En fait, le paramètre de pointeur transmis en C/C est également un appel de valeur. Si vous n'y 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);
  swap(a,b);
  printf("%d %d\n",*a,*b);
  return 0;
}

Mais C/C est appelé par référence. Il s'agit d'une méthode de déclaration de variable C/C appelée référence : int a; différence entre les deux alias en mémoire et ils occupent le même espace mémoire. Le paramètre passant par référence (alias) est conforme aux caractéristiques de l'appel de référence. Vous pouvez essayer les résultats de l'opération de void swap(int &a1,int &b1);.

A travers cet article, vous devez savoir si les paramètres de la méthode Java sont appelés par référence ou par valeur.

Pour plus d'articles sur la question de savoir si les paramètres de méthode Java sont des appels de référence ou des appels de valeur, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn