Verständnis des Java-Werttransfers:
Code 1:
public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); public static void SChange (StringBuffer str) { str= new StringBuffer("huang" } }Code 2:
public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); public static void SChange (StringBuffer str) { //str= new StringBuffer("huang");Lassen Sie uns den obigen Code 1 und Code 2 anhand von zwei Bildern erklären:
Originalzustand
Diagramm Code 1:
Verständnis von Code 2:
In Code 1 verweist die Kopierreferenz auf ein neues Objekt. Das ursprüngliche Objekt bleibt jedoch unverändert.
In Code 2 ändert der Kopierverweis das Originalobjekt.
Dies ist der übergebene Wert von Java.
Der Unterschied zwischen zwei Übertragungsarten in C++:
Verwenden Sie für C++-Wertübergabe, Referenzübergabe und Zeigermethoden den folgenden Code, um den Test zu verstehen und selbst auszuführen
#include <stdio.h> #include <iostream> #include <typeinfo> void ByValue(int a) { a = a + 1; } void ByRef(int& a) { a = a + 1; a) { *a = *a + 1; } int main(int argv, char** args) { int v = 1; ByRef(v); // Übergabe per Referenz ByPointer(&v); // Übergabe per Wert int* vp = &v ByPointer(vp); cout << typeid(vp).name() << std::endl; // std::cout << typeid(&vp).name() << std::endl; std::cout << "end" << std::endl }Die erste Funktion wird als Wert und die zweite Funktion als Referenz übergeben, aber für die beiden letztgenannten wird dieselbe Funktion einmal durch Call by Reference und einmal durch Call by Value aufgerufen.
Weil:
ByPointer(vp); Wenn vp nicht geändert wird, kann es nicht geändert werden. Wert übergeben
ByPointer(&v); ändert v. Als Referenz übergeben (Sie können sagen, dass tatsächlich die Adresse von v übergeben wird und ByPointer die Adresse von v nicht ändern kann. Dies ist also ein Aufruf nach Wert. Das klingt selbsterklärend, aber die Adresse von v sind reine Daten. Wann Der Aufruf existiert nicht im quadratischen Code, und v wird tatsächlich durch die ByPointer-Funktion geändert Die Betrachtung des Verhaltens ist die ursprüngliche Absicht der Bewertungsstrategie. Wenn alles in Werte abstrahiert wird und das Problem aus der Perspektive der Daten betrachtet wird, besteht keine Notwendigkeit, das Konzept der Bewertungsstrategie einzuführen, um das Publikum zu verwirren. )
nob: Die zusätzliche Zeigermethode kann auf zwei Arten verwendet werden: Übergabe eines Zeigers; Übergabe der Adresse oder Referenz einer Variablen Wenn Sie &v und vp anzeigen, werden Sie feststellen, dass beide vom Typ Point sind, also zwei Leistungen, das gleiche Ergebnis. Du denkst vielleicht so über mich
ByValue(&v); //error
, während die Übergabe von Parametern unterschiedlichen Typs in C++ die Kompilierung nicht direkt übergibt.
Zusammenfassen:
Ich denke also, dass man bei der Übergabe als Wert oder als Referenz nur sehen muss, wie es im Speicher abläuft.
Share-Memory bedeutet die Übergabe einer Referenz, und Copy-Memory bedeutet die Übergabe eines Werts (wobei zunächst einige Sonderfälle außer Acht gelassen werden).
In diesem Fall:
C/C++: Standardwertübergabe, Referenzübergabe und Zeiger werden separat verstanden (Zeiger können als Wertübergabe oder Referenzübergabe verstanden werden, und die Ergebnisse sind die gleichen).
JAVA: Grundlegende Datentypen werden als Wert übergeben, und Objekte werden auch als Wert übergeben (kopieren Sie die Referenz dieses Objekts).
C#: Wert nach Werttyp übergeben, Referenz nach Referenztyp übergeben, spezielles Verständnis von ref/out
Zeichenfolgen in JAVA und C# erfordern ein besonderes Verständnis. Das Erscheinungsbild muss als Wert übergeben werden, die tatsächliche Implementierung hängt jedoch von der virtuellen Maschine ab.