Cet article présente principalement des informations pertinentes sur l'explication détaillée des méthodes de passage de paramètres en Java. Les amis qui en ont besoin peuvent se référer à
Explication détaillée des méthodes de passage de paramètres en Java
.java Un sujet classique rencontré par les novices. Cet article est destiné à terminer ce sujet. Il y a un dicton en Java : Le passage de paramètres en Java se passe par valeur. J'ai bien peur que ce ne soit pas facile à expliquer avec des mots, et qu'il soit probablement difficile de le comprendre clairement.
Prémisse
Permettez-moi d'abord de clarifier, la notion de valeur ou de référence, elle vient du langage c++, la référence n'est pas un mot dans le dictionnaire chinois, mais c++ Concept - Vous souvenez-vous du symbole « & » ?
Pourquoi y a-t-il ce sujet ? Premièrement, il existe une compréhension incomplète du passage par référence ; deuxièmement, de nombreux livres et arguments de discussion Java ne font pas mouche.
En une phrase, qu'il s'agisse de transmettre des paramètres par valeur ou par référence, puisqu'il s'agit d'une méthode de transmission de paramètres, elle ne s'applique qu'aux paramètres formels et aux paramètres réels. Ce dont nous parlons ici, c'est du paramètre lui-même, pas. le sous-objet ou petit-enfant de l’objet paramètre.
Avec comme prémisse, entrez le code c++ :
#include <iostream> using namespace std; class User { private: int m_id; public: User(int id=0){m_id = id;} void setId(int id){m_id = id;} int getId(){return m_id;} }; void test0(User t){//按值传参 User s; t = s; t.setId(1002); cout << "test1:" << t.getId() << endl; } void test1(User *t){//按值传参 t = new User();//指针指向了一个新对象,外面实参没变 t->setId(1002); cout << "test1:" << t->getId() << endl; } void test2(User* & t){//按引用传参 t = new User();//指针指向了一个新对象,外面实参也跟着变了 t->setId(1002); cout << "test2:" << t->getId() << endl; } int main(int argc, char const *argv[]) { cout<< "\npass by ref:"<<endl; User* t = new User(); t->setId(1001); cout << t->getId() << endl; test2(t); cout << t->getId() << endl; cout<< "\npass by value:"<<endl; t = new User(); t->setId(1001); cout << t->getId() << endl; test1(t); cout << t->getId() << endl; return 0; }
Résultat de sortie :
pass by ref: 1001 test2:1002 1002 pass by value: 1001 test1:1002 1001
Résumé C++ :
est passé par valeur, puis les paramètres formels sont modifiés au sein de la fonction pour pointer vers un nouvel objet, et les paramètres externes réels ne sont pas affectés.
Passage par référence, puis les paramètres formels sont modifiés au sein de la fonction pour pointer vers un nouvel objet, et les paramètres réels externes sont également modifiés.
Visant à illustrer le problème, le code peut avoir une fuite de mémoire.
Java :
package com.pollyduan.bean; @Data public class User { private Integer id; public static void testObject(User t){ t=new User();//指向了一个新对象,外面实参没变 t.setId(1002); System.out.println("testObject="+t); } @Test public void testObject(){ User user=new User(); user.setId(1001); System.out.println("user="+user); testObject(user); System.out.println("user="+user); } }
Résumé de sortie :
user=User(id=1001) testObject=User(id=1002) user=User(id=1001)
Résumé Java :
Comparez-le avec la logique du C++ et prenez la décision vous-même.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!