[Für Anfänger] Ein Artikel, in dem Sie 5000 Billionen% von Javas kompliziertem "Passing by Reference" verstehen.

Hallo. Wir werden ein schleimiges Qiita-Debüt geben.

Dieser Artikel ist eine überarbeitete Version dessen, was zuvor unter einem anderen Namen und einem anderen Medium im Meer des Internets verblieben war. Bitte bereiten Sie Kaffee zu und gehen Sie mit uns aus.

Zielgruppe der Leser dieses Artikels

Ich werde es für diejenigen schreiben, die über Mindestkenntnisse in Java verfügen, aber es gibt kein Problem, selbst wenn Sie die Java-spezifische Beschreibung entsprechend lesen.

Einführung

Ist es nicht überhaupt schwierig, Java-Referenzen zu übergeben? Insgesamt denke ich nicht, dass es so schwierig ist, aber es gibt einige, die sich offensichtlich seltsam verhalten, obwohl Anfänger es nicht vermeiden können.

Ja, ** Rührtyp **. Sie sind Sie.

ehrlich gesagt, "Der String-Typ kann genauso behandelt werden wie der Basistyp (wie int)." "Verwenden Sie beim Vergleichen jedoch .equals () anstelle von ==" Es ist eine ziemliche Anerkennung.

Es fühlt sich jedoch unangenehm an, ruhig zu denken, nicht wahr?

ex0


	public static void main(String[] args) {
		String str1 = "Zeichenfolge 1";
		translate(str1);
		System.out.println(str1);//Zeichenfolge 1
	}
	private static void translate(String str2) {
		str2 = "String 2";
	}

In Java sind alle außer den Grundtypen Objekte (die die Object-Klasse erben). Und der String-Typ ist nicht der Basistyp. Es ist ein Objekt. Das Objekt wird als Referenz übergeben. Das heißt, es ist seltsam, wenn die Ausgabe nicht "Zeichenkette 2" ist, nicht wahr?

Wenn Sie verstehen, warum "Zeichenfolge 1" hier gedruckt wird, benötigen Sie diesen Artikel wahrscheinlich nicht. "Weil der String-Typ wie ein Basistyp ist" ist ... richtig, aber falsch. Es tut uns leid.

In diesem Artikel möchte ich Anfängern (denen, die die Bedeutung von Instanzen verstehen) erklären, was passiert.

Tatsächlich werden viele Leute, die Java bis zu einem gewissen Grad verstehen, sagen wollen: "Da der String-Typ unveränderlich ist, ist dies nur der Fall" oder "Java wird in erster Linie als Referenz übergeben!". Ich denke jedoch, dass es eine schwere Belastung für Anfänger sein wird.

Solange es eine ziemlich breite Erklärung von Java gibt, die auf den Konzepten "Übergeben von Wert" und "Übergeben von Referenz" basiert, ist es nutzlos zu verstehen, was "Übergeben von Wert" und "Übergeben von Referenz" beim Erlernen von Java vorerst zu sagen haben. Wäre nicht. So lass uns gehen.

Grundlagen in den Grundlagen: Im Fall von "Pass by Value"

Es ist das Grundprinzip, aber lassen Sie es uns überprüfen.

ex1


	public static void main(String[] args) {
		int num_sender = 1;
		add(num_sender);
		System.out.println(num_sender);//Es ist 1
	}

	private static void add(int num_receiver) {
		num_receiver += 1;
	}

Die empfohlene Art, sich daran zu erinnern, ist ** "Num_senders Nummer" 1 "in Ihrem Kopf ist" auf eine weiße Karte geschrieben "und an die add () -Methode übergeben" **.

Schreiben Sie die Nummer in Ihren Kopf auf die Karte und geben Sie sie weiter.

Unabhängig von der Methode add () ändert sich die Zahl im Kopf von num_sender nicht. In diesem Fall jedoch ...

ex2


	public static void main(String[] args) {
		int num_sender = 1;
		num_sender = add(num_sender);
		System.out.println(num_sender);//Es ist 2
	}

	private static int add(int num_receiver) {
		num_receiver += 1;
		return num_receiver;
	}

Wird explizit von num_sender geordnet ** "Merke dir die geänderten Zahlen !!!" **, also wird die Ausgabe "2" sein. Ja, na klar.

Einige mögen denken, dass es zu einfach ist, aber bleiben Sie bis zum Ende dran. Es wird später wirksam.

Grundlegend 2: Als Referenz übergeben

ex3


	public static void main(String[] args) {
		List<String> onlyOneList = new ArrayList<String>();
		onlyOneList.add("2018");
		replaceFirstItemTo2019(onlyOneList);
		System.out.println(onlyOneList.get(0));//"2019"
	}

	//Das erste Element der Liste wird 2019 sein
	private static void replaceFirstItemTo2019(List<String> another_hensu) {
		another_hensu.add(0, "2019");
	}

Ich habe versucht, es zu einem etwas vulgären Variablennamen zu machen, aber stellen Sie sich vorerst vor, dass das Übergeben als Referenz "nur ein Objekt (Objekt) manipuliert".

Wenn Sie sich dennoch unwohl fühlen, denken Sie so. Der Inhalt der Variablen "onlyOneList-kun" ** macht ein Nickerchen in Raum 20 des Luxushotels "memory". ** ** ** ** Raum 20 wurde irgendwie entschieden, als ich neue ArrayList (); ** ** **

Ich habe es leicht geschrieben, aber es ist ein sehr wichtiger Ort, also denk bitte daran. ………… Ist es wirklich wichtig? Hast du das gesagt

Davon abgesehen, was an die Methode replaceFirstItemTo2019 () übergeben wird "Raum 20" Das ist die Information.

Bei der Methode replaceFirstItemTo2019 () wird das erste Element der einzigen Liste, die in Raum 20 schläft, in "2019" umgeschrieben. Die Informationen, die schließlich ausgegeben werden, sind die Informationen, die als "Raum 20-Informationen", dh "Es ist 2019", umgeschrieben wurden.

Dies ist, was die Java Chottodex-Leute "Referenzübergabe" nennen. Was ist hier der Unterschied zwischen "Referenz" und "Referenzwert"? Wenn Sie denken ... Vergessen Sie es, weil nicht genügend Platz vorhanden ist.

Nun, die Überprüfung ist vorbei. Es ist eine kleine Anwendung von hier.

Das ist schwierig, nicht wahr Java?

Bitte lesen Sie diesen Code.

ex_4


	public static void main(String[] args) {
		List<String> onlyOneList = new ArrayList<String>();
		onlyOneList.add("2018");
		replaceFirstItemTo2019(onlyOneList);
		System.out.println(onlyOneList.get(0));//"2018"
	}

	//Das erste Element der Liste wird 2019 sein
	private static void replaceFirstItemTo2019(List<String> another_hensu) {
		another_hensu = new ArrayList<String>();
		another_hensu.add(0, "2019");
	}

Nande ist noch 2018! ?? ?? ?? ** Nicht mehr ... es ist vorbei **

Es gibt Zeiten, in denen Sie dies in der Praxis ohne einen Witz tun. Seien wir vorsichtig!

Dies ist die einzige Zeile, die ich aus dem vorherigen Beispiel neu geschrieben habe.

another_hensu = new ArrayList<String>();

Aber das ist ein Durcheinander und eine ernste Sache. Denken Sie daran, was ich früher geschrieben habe.

Der Inhalt der Variablen "onlyOneList-kun" ist ein Luxushotel"memory"Ich mache ein Nickerchen in Raum 20.
Die Nummer von Raum 20 ist eine neue Array-Liste<String>();Irgendwie wurde entschieden, wann ich es tat.

Mit anderen Worten, was neu ist, ist ** "ein Schlafzimmer in einem Hotel zuzuweisen (Speicher) und dann ein neues Ding (Objekt) zu erstellen" **. Hier wird "Raum 21" oder eine andere Raumnummer, die sich von Raum 20 unterscheidet, dem Inhalt von "anothe_hensu-kun" zugewiesen, und dann wird eine neue Liste erstellt. Und die von der Variablen "onlyOneList-kun" aufgezeichneten Informationen bleiben "Raum 20". Erschwerend kommt hinzu, dass List derzeit nicht mehr die einzige ist!

"2019 ist 2019" wird also in der Liste von "Raum 21" gespeichert, aber es gibt keine Änderung in der Liste von "Raum 20", die die Informationen von "onlyOneList-kun" enthält, und es ist "2018" wie es ist. "Wird ausgegeben. ...... Das ist.

Für String-Typ

Wenn Sie so weit gelesen haben, können Sie es verstehen.

ex0


	public static void main(String[] args) {
		String str1 = "Zeichenfolge 1";
		translate(str1);
		System.out.println(str1);//Zeichenfolge 1
	}
	private static void translate(String str2) {
		str2 = "String 2";
	}

In diesem Code ist der String-Typ sicherlich ein "Objekt" und wird als "Referenzübergabe" übergeben.

Der String-Typ ist jedoch "unveränderlich". …… Was meinst du mit Ya? Dies bedeutet, dass Sie nicht direkt mit dem Objekt herumspielen können.

……

** …… Was meinst du mit Ya! ?? Scharf sein! !! ?? ** ** **

Erstens als Prämisse im Fall von String "ausnahmsweise"


String str1 = "Zeichenfolge 1";

Allein mit dieser Beschreibung wird ein Objekt vom Typ String "geboren und in einem geeigneten Raum im" Speicher "des Luxushotels gespeichert. Nehmen wir an, Sie wurden diesmal in "Raum 22" geboren.

Ich werde den Schreibstil wieder ändern.

(String)Variablennamen= "hoge";

** Allein mit dieser Beschreibung wird ein Objekt vom Typ String "geboren und in einem geeigneten Raum im" Speicher "des Luxushotels gespeichert. ** ** **

Was bedeutet das?

str2 = "String 2";

Zum Zeitpunkt des Schreibens dieses Artikels wurde "Raum 23" (ich weiß nicht, ob es sich um Raum 24 oder 5000 Billionen handelt, aber er befindet sich in einem anderen Raum als Raum 22) geboren. Dann, wie man "Zeichenkette 1" ändert, wenn man in "Raum 22" schläft ...! ??

** Es gibt keine solche Sache. ** ** ** Das ist sehr schade. Lass uns aufgeben. Dies bedeutet schließlich "String-Typ ist unveränderlich" oder "Objekt kann nicht direkt geändert werden".

Der Inhalt (die Werte) von Variablen, wie er von der Person gesehen wird, die das Programm schreibt, kann neu geschrieben werden. Dies bedeutet, dass Sie "Raum 22" in "Raum 23" umschreiben können.

Infolgedessen wird dieses Verhalten zu einem grundlegenden Verhalten vom Typ = Wertübergabe. Das ist es.

Anwendung: Was macht der String-Typ schließlich?

(Sie können diesen Abschnitt überspringen)

Zusamenfassend,

String str1 = "Zeichenfolge 1";

Ist

String str1 = new String("Zeichenfolge 1");

Es ist eine Syntax Zucker von. das ist alles!









Es tut mir leid, dass es eine Lüge ist. Es tut mir Leid. Ich wusste das, bis ich diesen Artikel schrieb, aber es gibt Gegenbeweise ...

ex_*


	public static void main(String[] args) {
		String a = "Ah";
		String b = "Ah";
		System.out.println(a == b); //true
	}

** Oh, du warst wahr ... ** Selbst wenn ein Anfänger dieses Verhalten versucht und verschiedene Personen fragt: "Sind Sie ???. Equals () Sie können mit == vergleichen, ohne sich die Mühe zu machen, es zu verwenden ???" Du kannst es nicht bekommen. ** Ich war. ** ** **

(Referenz) ** In Java ist „Hoge“ nicht nur ein neuer String-Syntaxzucker („Hoge“) ** http://blog.supermomonga.com/articles/java/difference-bewtween-two-way-to-create-string-instanc.html

Wahrscheinlich gibt es einen Mechanismus, um Objekte für genau dieselbe Zeichenfolge wiederzuverwenden, um Speicherplatz zu sparen. → Es war die richtige Antwort. ** Unterschied zwischen Initialisierung durch "" (doppeltes Anführungszeichen) und Initialisierung durch neuen String ("") ** http://education.yachinco.net/tips/java/06/2.html

Ich bin glücklich.

Referenz

** Nenne es nicht mehr als Referenz ** https://qiita.com/mdstoy/items/2ef4ada6f88341466783

das Ende. Wir sehen uns irgendwo.

Recommended Posts

[Für Anfänger] Ein Artikel, in dem Sie 5000 Billionen% von Javas kompliziertem "Passing by Reference" verstehen.