Maison > Java > javaDidacticiel > Explication détaillée du passage de valeurs Java et du passage de références

Explication détaillée du passage de valeurs Java et du passage de références

高洛峰
Libérer: 2017-01-24 16:54:00
original
1550 Les gens l'ont consulté

Lorsqu'un objet est passé en paramètre à une méthode, la méthode peut modifier les propriétés de l'objet et renvoyer les résultats modifiés. Alors, est-il passé par valeur ou par référence
Réponse : C'est un transfert de valeur. . Le langage de programmation Java n'a que des paramètres transmis par valeur. Lorsqu'une instance d'objet est passée en paramètre à une méthode, la valeur du paramètre est une copie de la référence de l'objet. En pointant vers le même objet, le contenu de l'objet peut être modifié dans la méthode appelée, mais la référence à l'objet (pas une copie de la référence) ne changera jamais.

Les paramètres Java, qu'ils soient de types primitifs ou de types référence, sont passés en copies (il existe une autre façon de dire que c'est par valeur, mais c'est plus facile à comprendre quand on dit qu'ils sont passés par un Le passage par valeur est généralement relatif au passage par adresse) ).

Si le type de paramètre est un type primitif, alors ce qui est transmis est une copie du paramètre, qui est la valeur du paramètre d'origine. C'est la même chose que la transmission de valeur discutée précédemment. Changer la valeur de la copie dans la fonction ne change pas la valeur d'origine.

Si le type de paramètre est un type de référence, alors ce qui est transmis est une copie du paramètre de référence, et cette copie stocke l'adresse du paramètre. Si l'adresse de cette copie n'est pas modifiée dans la fonction, mais que la valeur de l'adresse est modifiée, alors la modification dans la fonction affectera les paramètres transmis. Si l'adresse de la copie est modifiée dans la fonction, par exemple new, alors la copie pointe vers une nouvelle adresse. À ce moment, le paramètre transmis pointe toujours vers l'adresse d'origine, donc la valeur du paramètre ne sera pas modifiée. .

Exemple :

public class ParamTest {
  public static void main(String[] args){
   /**
    * Test 1: Methods can't modify numeric parameters
    */
   System.out.println("Testing tripleValue:");
   double percent = 10;
   System.out.println("Before: percent=" + percent);
   tripleValue(percent);
   System.out.println("After: percent=" + percent);
  
   /**
   * Test 2: Methods can change the state of object parameters
   */
   System.out.println("\nTesting tripleSalary:");
   Employee harry = new Employee("Harry", 50000);
   System.out.println("Before: salary=" + harry.getSalary());
   tripleSalary(harry);
   System.out.println("After: salary=" + harry.getSalary());
  
   /**
   * Test 3: Methods can't attach new objects to object parameters
   */
   System.out.println("\nTesting swap:");
   Employee a = new Employee("Alice", 70000);
   Employee b = new Employee("Bob", 60000);
   System.out.println("Before: a=" + a.getName());
   System.out.println("Before: b=" + b.getName());
   swap(a, b);
   System.out.println("After: a=" + a.getName());
   System.out.println("After: b=" + b.getName());
  }
  
  private static void swap(Employee x, Employee y) {
   Employee temp = x;
   x=y;
   y=temp;
   System.out.println("End of method: x=" + x.getName());
   System.out.println("End of method: y=" + y.getName());
  }
  
  private static void tripleSalary(Employee x) {
   x.raiseSalary(200);
   System.out.println("End of method: salary=" + x.getSalary());
  }
  
  private static void tripleValue(double x) {
   x=3*x;
   System.out.println("End of Method X= "+x);
  }
 }
Copier après la connexion

Afficher les résultats :

Testing tripleValue:
Before: percent=10.0
End of Method X= 30.0
After: percent=10.0
 
Testing tripleSalary:
Before: salary=50000.0
End of method: salary=150000.0
After: salary=150000.0
 
Testing swap:
Before: a=Alice
Before: b=Bob
End of method: x=Bob //可见引用的副本进行了交换
End of method: y=Alice
After: a=Alice //引用本身没有交换
After: b=Bob
Copier après la connexion

L'apprentissage de chacun a été utile et j'espère que tout le monde visitera le site Web PHP en chinois.

Pour des articles plus détaillés sur le passage de valeurs Java et le passage de références, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal