Dieser Artikel analysiert den Call-by-Value in Java anhand von Beispielen. Teilen Sie es als Referenz mit allen. Die spezifische Analyse lautet wie folgt:
Java verwaltet Objektinstanzen per Referenz
Es kann bestätigt werden, dass die Art und Weise, Objekte in Java zu bedienen, darin besteht, Objekte per Referenz zu bedienen. Um dies besser zu verstehen, habe ich den folgenden Code geschrieben:
Definieren Sie zunächst einen benutzerdefinierten Typ. Der Code lautet wie folgt: öffentliche Klasse Person {
Stringname;
Person(String name){
this.name = Name;
}
}
Der Name ist hier standardmäßig öffentlich (was sich vom Standardattribut der Klasse in C++ unterscheidet).
Dann lautet der Aufruf in der Main-Funktion wie folgt:
Kopieren Sie den Code wie folgt: public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Automatisch generierter Methoden-Stub
Person p1 = neue Person("Paul");
Person p2 = neue Person("Griefen");
System.out.println("p1.name = " + p1.name + " p2.name = " + p2.name);
Personentmp;
tmp = p1;
p1 = p2;
System.out.println("tmp.name = " + tmp.name + " p1.name = " + p1.name + " p2.name = " + p2.name);
}
}
Die Ausgabe ist zu diesem Zeitpunkt wie folgt:
Kopieren Sie den Code wie folgt: p1.name = Paul p2.name = Griefen
tmp.name = Paul p1.name = Griefen p2.name = Griefen
Hä? Warum ist das ein Ergebnis? Als CPPer bin ich verwirrt! Da es sich um eine Referenz handelt, kopieren Sie den Code nach der Ausführung der folgenden Anweisung wie folgt: Person tmp;
tmp = p1;
p1 = p2;
Da ich diese Operation gemäß dem Referenzkonzept in C++ verstehe, sollten tmp p1 p2 zu diesem Zeitpunkt alle dasselbe Objekt sein, das heißt, sie sollten alle auf das Objekt p2 zeigen. Doch die Ausgabe beweist deutlich, dass dieses Verständnis falsch ist! Da Referenzen in Java also nicht dasselbe sind wie Referenzen in C++? ! ! ! Ist es dasselbe wie ein Zeiger in C++?
Gut! Lassen Sie uns diesen Operationsprozess anhand von Zeigern in C++ verstehen.
Zunächst deklariert Person tmp; einen Zeiger, der der Zeigerdeklaration in C++ ähnelt. In C++ ist klar festgelegt, dass die Referenzdeklaration auf diese Weise nicht separat geschrieben werden kann. Die Argumentation im ersten Schritt ist offensichtlich korrekt. Das ist ein guter Anfang! Dann zeigt tmp = p1; p1 = p2; Offensichtlich zeigt tmp auf p1 und p1 auf p2. Es wurde festgestellt, dass es konsistent ist!
Das heißt, wenn Referenzen in Java mit Datenoperationen in C++ verglichen werden, sollten sie dem Konzept der Zeiger in C++ ähnlicher sein!
Zeiger in C++ implementieren die oben genannten Funktionen
Da die obige Methode zum Bedienen von Objekten in Java dem Zeiger in C++ ähnelt, schauen wir uns an, wie die obige Methode in C++ implementiert wird. Kopieren Sie den Code wie folgt: #include „stdafx.h“
#include <string>
#include <iostream>
Klasse Person
{
öffentlich:
std::string name;
öffentlich:
Person(std::string name)
{
this->name = name;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
Person* p1 = neue Person("Paul");
Person* p2 = neue Person("Griefen");
std::cout<< "p1.name " << p1->name << " p2.name = " << p2->name << std::endl;
Person* tmp;
tmp = p1;
p1 = p2;
std::cout<<"tmp.name" << tmp->name << " p1.name " << p1->name << " p2.name = " << p2->name << std::endl ;
tmp löschen;
p1 löschen;
0 zurückgeben;
}
Nach dem Debuggen stellte ich fest, dass das Ausgabeergebnis mit dem obigen Java-Ausführungsergebnis übereinstimmt.
Die zugrunde liegende Implementierung ist bei jeder Sprache dieselbe
Da der Referenzeffekt in Java derselbe zu sein scheint wie der Zeiger in C++, warum wird er in Java nicht direkt als Zeiger bezeichnet? Offensichtlich gibt es Unterschiede. Beispielsweise können Referenzen in Java keine ++-Operationen ausführen, aber Zeiger in C++ können und können nach Belieben verschoben werden. Offensichtlich hat Java zu diesem Zeitpunkt viel an seinen Zeigern gearbeitet, um sie einzuschränken und ihre Ausführung sicherer zu machen. Aber egal wie groß die obere Schicht zu sein scheint, wenn Sie die untere Schicht erreichen, müssen Sie Speicher beantragen, und der Speicher muss freigegeben werden, nachdem er aufgebraucht ist. Das ist Arbeit in jeder Sprache!
Ich hoffe, dass dieser Artikel für die Java-Programmierung aller hilfreich sein wird.