Cet article analyse l'appel par valeur en Java avec des exemples. Partagez-le avec tout le monde pour votre référence. L’analyse spécifique est la suivante :
Java exploite les instances d'objet par référence
Ce qui peut être confirmé, c'est que la façon d'opérer des objets en Java est d'opérer des objets par référence. Afin de mieux comprendre cela, j'ai écrit le code suivant :
Définissez d'abord un type personnalisé. Copiez le code. Le code est le suivant : public class Person {.
Nom de la chaîne ;
Personne (nom de chaîne) {
this.name = nom ;
}
}
Le nom ici est par défaut public (ce qui est différent de l'attribut par défaut de la classe en C++)
Ensuite l’appel dans la fonction Main est le suivant :
Copiez le code comme suit : public class Main {
/**
* @param arguments
*/
public static void main (String[] arguments) {
// TODO Stub de méthode généré automatiquement
Personne p1 = nouvelle Personne("Paul");
Personne p2 = new Person("Griefen");
System.out.println("p1.name = " + p1.name + " p2.name = " + p2.name);
Personne tmp ;
tmp = p1 ;
p1 = p2 ;
System.out.println("tmp.name = " + tmp.name + " p1.name = " + p1.name + " p2.name = " + p2.name);
}
}
Le résultat à ce moment est le suivant :
Copiez le code comme suit : p1.name = Paul p2.name = Griefen
tmp.name = Paul p1.name = Griefen p2.name = Griefen
Hein? Pourquoi est-ce un résultat ? En tant que CPPer, je suis confus ! Il s'agit d'une référence, donc après avoir exécuté l'instruction suivante, copiez le code comme suit : Person tmp;
tmp = p1 ;
p1 = p2 ;
Parce que je comprends cette opération selon le concept de référence en C++, alors tmp p1 p2 devraient tous être le même objet à ce moment, c'est-à-dire qu'ils devraient tous pointer vers l'objet p2. Mais le résultat prouve clairement que cette compréhension est fausse ! Alors puisque les références en Java ne sont pas la même chose que les références en C++ ? ! ! ! Est-ce la même chose qu'un pointeur en C++ ?
bien! Comprenons ce processus opérationnel selon les pointeurs en C++.
Tout d’abord, Person tmp; déclare un pointeur, similaire à la déclaration de pointeur en C++. En C++, il est clairement stipulé que la déclaration de référence ne peut pas être écrite séparément de cette manière. Lorsque la déclaration de référence est faite, elle doit pointer vers un objet. Évidemment, le raisonnement de la première étape est correct. C'est un bon début ! Alors tmp = p1; p1 = p2; Évidemment, tmp pointe vers p1 et p1 pointe vers p2. Cela s'est avéré cohérent !
Cela signifie que si les références en Java sont comparées aux opérations de données en C++, elles devraient être plus similaires au concept de pointeurs en C++ !
Les pointeurs en C++ implémentent les fonctions ci-dessus
Étant donné que la méthode ci-dessus pour faire fonctionner les objets en Java est similaire au pointeur en C++, voyons comment implémenter la méthode ci-dessus en C++. Copiez le code comme suit : #include "stdafx.h".
#include <chaîne>
#include <iostream>
personne de classe
{
publique:
std::nom de chaîne ;
publique:
Personne (std :: nom de chaîne)
{
ceci->nom = nom ;
} ;
} ;
int _tmain(int argc, _TCHAR* argv[])
{
Personne* p1 = nouvelle Personne("Paul");
Personne* p2 = new Personne("Griefen");
std::cout<< "p1.name " << p1->name << " p2.name = " << p2->name << std::endl;
Personne* tmp;
tmp = p1 ;
p1 = p2 ;
std::cout<<"tmp.name" << tmp->name << " p1.name " << p1->name << " p2.name = " << p2->name << std::endl ;
supprimer tmp ;
supprimer p1 ;
renvoie 0 ;
}
Après le débogage, j'ai constaté que le résultat de sortie est le même que le résultat d'exécution Java ci-dessus.
L'implémentation sous-jacente de n'importe quel langage est la même
Puisque l'effet de référence en Java semble être le même que le pointeur en C++, pourquoi n'est-il pas appelé pointeur directement en Java ? Il existe évidemment des différences. Par exemple, les références en Java ne peuvent pas effectuer d'opérations ++, mais les pointeurs en C++ peuvent et peuvent être déplacés à volonté. Évidemment, à ce stade, Java a fait beaucoup de travail sur ses pointeurs pour les restreindre et les rendre plus sûrs. Mais quelle que soit la taille de la couche supérieure, lorsque vous arrivez à la couche inférieure, vous devez demander de la mémoire, et la mémoire doit être libérée une fois épuisée. C'est du travail dans n'importe quelle langue !
J'espère que cet article sera utile à la programmation Java de chacun.