Heim >Java >javaLernprogramm >Detaillierte Erläuterung der Referenz- und Wertübergabe in Java

Detaillierte Erläuterung der Referenz- und Wertübergabe in Java

巴扎黑
巴扎黑Original
2017-07-20 13:11:201441Durchsuche

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 }
Code anzeigen

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

Variable m --- & gt;

🎜> 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn