OCAJP – Wertübergabe oder Referenzübergabe

Eines der am meisten diskutierten Themen in Java ist die Frage, ob die Methodenargumente als Referenz oder als Wert übergeben werden. In diesem Tutorial möchte ich das gleiche alte Konzept in Bezug auf die OCAJP-Zertifizierung erklären. In Java wird alles als Wert übergeben. Hier ist das Prüfungsziel für OCAJP 7 und OCAJP 8:

6.6 – Bestimmen Sie die Auswirkung auf Objektreferenzen und Grundwerte, wenn diese an Methoden übergeben werden, die die Werte ändern

Wenn Sie hier sind, haben Sie wahrscheinlich schon viele andere sagen gehört, dass in Java primitive Typen durch Werte und Objekte durch Referenzen übergeben werden. Java ist eine „Pass-by-Value“-Sprache. Das bedeutet, dass eine Kopie der Variablen erstellt wird und die Methode diese Kopie erhält. In der Methode vorgenommene Zuweisungen haben keine Auswirkungen auf den Aufrufer. In diesem Beitrag würde ich das sehr ausführlich erklären. Am Ende dieses Beitrags habe ich einige Probeprüfungsfragen zum gleichen Thema.

Hier werde ich Ihnen ein einfaches Beispiel geben, um zu verstehen, was Pass-by-Value und was Pass-by-Reference ist.

Java-Übergabewert

Was ist Pass-by-Reference?

Nehmen wir an, ich möchte nützliche Informationen von einer Webseite an meine Kollegen weitergeben. Wenn ich meinen Kollegen die URL zur Verfügung stelle, um auf diese Webseite zu verweisen, übergebe ich ihnen eine Referenz, um die Webseite zu überprüfen. Wenn ich Änderungen an dieser Seite vornehme, wird dies immer in dieser URL angezeigt, wenn sie als Referenz geöffnet wird.

Dies wird in der Programmierwelt als Referenzübergabe bezeichnet. Technisch gesehen bedeutet die Übergabe als Referenz, dass der Parameter der aufgerufenen Methode mit dem vom Aufrufer übergebenen Argument identisch ist (nicht der Wert, sondern die Identität und die Variable selbst).

Was ist Pass-by-Value?

Wenn ich ihnen dagegen eine ausgedruckte Kopie dieser Webseite als Referenz zur Verfügung stelle, handelt es sich um eine völlig unverbundene Kopie dieser Webseite, bei der die auf der Seite (Originalkopie) aktualisierten Änderungen überhaupt nicht in der Kopie widergespiegelt werden. Wenn sie diese Kopie nicht möchten, können sie sie sicher vernichten, ohne dass dies Auswirkungen auf die Originalquelle hat.

Dies wird in der Programmierwelt als Wertübergabe bezeichnet. In der Fachsprache bedeutet Übergabe als Wert, dass der Parameter der aufgerufenen Methode eine Kopie des übergebenen Arguments des Aufrufers ist. Der Wert wird derselbe sein, aber die Identität – die Variable – ist unterschiedlich. In Java wird alles ohne Frage strikt als Wert übergeben.

In den folgenden Abschnitten werde ich die Wertübergabe in Java für primitive Typen und Objektreferenzen anhand einfacher Beispiele erläutern.

Primitive Typen

Das Verständnis primitiver Typen ist für jeden, der über Grundkenntnisse in Java verfügt, sehr einfach und unkompliziert. Schauen wir uns das folgende Beispiel an:

public class Application {
	public static void main(String args[]) {
		int x = 10;
		int y = 20;
		swap(x,y);
		System.out.println(x);
		System.out.println(y);
		
	}
	public static void swap(int i, int j){
		int temp = i;
		i = j;
		j = temp;
	}
}

Wenn Sie das obige Beispielprogramm ausführen, werden die Werte nicht vertauscht und die Werte von x und y sind nach der Ausführung gleich swap Methode. Was hinter den Kulissen passiert ist, ist, dass eine Kopie von x und y an die Methode übergeben und an einer neuen Adresse gespeichert wird. Daher haben Änderungen innerhalb dieser Methode keinen Einfluss auf die ursprünglichen Werte.

Objektreferenzen

Die meiste Verwirrung rund um Objektreferenzen ist auf mangelndes Verständnis der Objektmanipulation und -zuweisung zurückzuführen. Wenn Sie eine Objektreferenz an eine Methode übergeben, wird die gesamte Kopie der Referenz an die Methode übergeben. Das heißt, der Inhalt der Referenz (Adresse/Standort des tatsächlichen Objekts) wird an die Methode gesendet und alle Änderungen am Objekt werden im Originalobjekt widergespiegelt.

Schauen Sie sich das folgende Beispiel an:

public class ObjectReferenceMockExam {
	public static void main(String args[]) {
		StringBuilder builder = new StringBuilder("Wonderful");
		changeStr(builder);
		System.out.println(builder.toString());
	}
	public static void changeStr(StringBuilder builder){
		builder.append(" World");
		StringBuilder builder2 = new StringBuilder("Amazing World");
		builder = builder2;
	}
}

Wenn Sie das obige Programm ausführen, erhalten Sie die Ausgabe „Wonderful World“ und nicht „Amazing World“. Dies beweist, dass Objektreferenzen als Wert übergeben werden.

Wenn Sie ein Originalobjekt erstellen StringBuilder builder= new StringBuilder("Wonderful")

Hier würde die Referenz „Builder“ die Speicheradresse enthalten, beispielsweise „14345“. Dies ist nur die Speicheradresse (oder sagen wir die Fernbedienung für den Zugriff). StringBuilder Objektinhalt). Bei der Übergabe an eine Methode wird tatsächlich der Wert (Speicheradresse) 14345 übergeben. Dies selbst ist kein Objektinhalt, sondern lediglich ein Handler zum Ändern des Objektinhalts. Wenn Sie dann innerhalb der Methode ein neues Objekt mit der Referenz „builder2“ erstellen, kann dieses beispielsweise einen weiteren Speicherort „16785“ enthalten. Beim Ersetzen wird lediglich der Speicherort und nicht der Inhalt des Objekts ausgetauscht.

Ich hoffe, dass dies gut genug ist, um dieses Konzept für die Prüfung zu verstehen. Wenn Sie nach weiteren Erklärungen suchen, werfen wir einen Blick auf die Erklärung unseres Freundes Joe in seinem Beitrag Hier. Im nächsten Abschnitt werden wir einige Probeprüfungen durchführen.

OCAJP-Scheinprüfung

1. Betrachten Sie den folgenden Code:

public class Main {
	public static void main(String args[]) {
		int x = 10;
		int y = 20;
		swap(x,y);
		System.out.println(x);
		System.out.println(y);
		
	}
	public static void swap(int i, int j){
		int temp = i;
		i = j;
		j = temp;
	}
}

Was wird ausgegeben, wenn Sie das obige Programm ausführen?

A. 10 20
B. 20 10
C. 20 20
D. 10 10

2. Betrachten Sie den folgenden Code:

public class Main {
	private static String str = "Hello";
	public static void main(String args[]) {
		changeStr(str);
		System.out.println(str);
	}
	public static void changeStr(String str){
		str = "Hello World";
	}
}

Was wird das Ergebnis des obigen Programms sein?

A. Hallo Welt
B. Hallo
C. Compilerfehler
D. Laufzeitausnahme

3. Betrachten Sie den folgenden Code:

public class ObjectReferenceMockExam {
	public static void main(String args[]) {
		StringBuilder builder = new StringBuilder("Wonderful");
		changeStr(builder);
		System.out.println(builder.toString());
	}
	public static void changeStr(StringBuilder builder){
		builder.append("World");
		StringBuilder builder2 = builder;
		builder2.append(" for everyone");
	}
}

Was wird das Ergebnis des obigen Programms sein?

Ein wundervoller
B. Wunderbare Welt
C. Wunderbare Welt für alle
D. Compilerfehler

Korrekte Antworten:

1. A

In Java werden Grundelemente als Wert übergeben. Wenn Sie die Methoden aufrufen, sind alle Zuweisungen innerhalb der Methode lokal für diese Methode und haben keinen Einfluss auf die tatsächlichen Variablen x und y.

2. B

Die Objektreferenzen werden als Wert übergeben, daher ändert keine Zuweisung innerhalb der Methode den ursprünglichen Wert in der aufrufenden Methode.

Ein Beispiel:
Objekt o1 = neues Objekt(); // Nehmen wir an, das Objekt wird am Speicherort 15000 gespeichert. Da o1 tatsächlich die Adresse des Speicherorts speichert, an dem das Objekt gespeichert ist, enthält es 15000. Wenn Sie nun someMethod(o1); Der Wert 15000 wird an die Methode übergeben. Innerhalb der Methode someMethod(): someMethod( Object localVar) { localVar enthält jetzt 15000, was bedeutet, dass es auch auf denselben Speicherort verweist, an dem das Objekt gespeichert ist. Wenn Sie daher eine Methode für localVar aufrufen, wird diese für dasselbe Objekt ausgeführt. Wenn Sie jedoch den Wert von localVar selbst ändern, beispielsweise wenn Sie localVar=null verwenden,
Dann zeigt es auf einen anderen Speicherort. Aber die ursprüngliche Variable o1 enthält immer noch 15000, sodass sie immer noch auf dasselbe Objekt verweist.

3. C

Wenn Sie eine Objektreferenz in einem Methodenargument übergeben, übergeben Sie tatsächlich die Kopie dieser Referenz. Das bedeutet den Speicherort, an dem das eigentliche Objekt gespeichert ist. Alle Änderungen an dem in dieser Referenz gespeicherten Wert würden sich auf das ursprüngliche Objekt auswirken. Obwohl Sie im obigen Beispiel einer lokalen Variablen „builder2“ zuweisen, versuchen Sie, den Inhalt dieser Referenz zu ändern, da dadurch das StringBuilder-Objekt selbst geändert wurde.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen