Schauen wir uns zunächst einen Code an, bei dem es sich um eine schriftliche Interviewfrage handelt, auf die ich gestoßen bin:
1 /** 2 * ***面试题 3 */ 4 public class StringBufferTest { 5 public static void main(String[] args) { 6 int i = 10; 7 test(i); 8 System.out.println(i);//10 9 StringBuffer str = new StringBuffer("str");10 test2(str);11 System.out.println(str.toString());//str_add12 test3(str);13 System.out.println(str.toString());//str_add14 }15 16 public static int test(int m) {17 m = 30;18 return m;19 }20 21 public static StringBuffer test2(StringBuffer str2) {22 str2.append("_add");23 return str2;24 }25 26 public static StringBuffer test3(StringBuffer str3) {27 str3 = new StringBuffer("java");28 return str3;29 }30 31 }
Wertübertragung:
Der Wert von i wird nicht 30, da dem Eingabeparameter in der Testmethode ein Wert von 30 zugewiesen wird
Also Der Methodentest wird ausgeführt (i) Nach dem Drucken ist der Wert von i immer noch der vorherige Wert 10
Der spezifische Prozess ist wie folgt:
Variable i---->[Speicherwert 10]
Aufruf ausführen Bei Verwendung der test(i)-Methode ist die Situation im Speicher wie folgt: i kopiert seinen eigenen Wert in den Speicher, und dann zeigt die Variable m auf die kopierte 10.
Variable i ---- & gt; [Speicherwert 10] ↓ Führen Sie eine Wertkopie durch
🎜> Zu diesem Zeitpunkt, wenn die Ausführung Zeile 17 erreicht, wird der Variablen m der Wert 30 zugewiesen, und die Operation dieses Schritts hat nichts mit i zu tun. Variable m--->[Speicherwert 30] Übergabe als Referenz: (Achten Sie bei der Verwendung globaler Variablen besonders darauf, ob sich die Änderung auf andere auswirkt Stellen) Der an die test2-Methode übergebene Str ist ein Verweis auf str, daher wirken sich Änderungen in str2 auf den Wert von str aus Daher wird nach der Ausführung der Methode test2(str) der Wert von Der gedruckte str wird zu str_add Der spezifische Prozess ist wie folgt: Variable str---->[Speicherwert „str“] Test2(str) ausführen. Beachten Sie, dass sich dies wesentlich von der Wertübertragung unterscheidet: Beim Aufruf von test2(str) zeigt die Variable str2 auch auf den Speicherplatz, auf den str zeigt, und nicht auf eine Kopie von str. int int logous in Der Wert von space und der Wert von str ändern sich ebenfalls entsprechend.
Variable str
Der Wert ist nicht Java, sondern str_add?
Der Hauptgrund ist: str3 = new StringBuffer("java"); Diese Codezeile
Es gibt eine Änderung ähnlich der Kopie des eingehenden Werts: Die neue Methode ändert sich nicht Der Inhalt des Speichers, auf den str zeigt, aber Es wird ein neuer Raum zum Speichern der Zeichenfolge „Java“ geöffnet, und str3 zeigt auf diesen Raum.
Der spezifische Prozess ist wie folgt:
Das Programm wird bis Zeile 12 ausgeführt, str zeigt auf einen Speicherplatz, in dem „str_add“ gespeichert ist.
Variable str---->[Speicherwert „str_add“]
Rufen Sie test3(str) auf und verweisen Sie str3 auf den Speicherbereich, auf den str zeigt, der die übergebene Referenz ist str.
Variable str
; Die neue Methode ändert nicht den Inhalt des Speichers, auf den str zeigt, sondern öffnet einen neuen Platz zum Speichern der Zeichenfolge „java“ und str3 zeigt auf dieses Leerzeichen. Variable str---->[Speicherwert „str_add“]. ]
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Referenz- und Wertübergabe in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!