Call by Reference: Unterschied zwischen den Versionen

Aus EINI
Wechseln zu: Navigation, Suche
(Beispiel)
Zeile 11: Zeile 11:
 
   NumberStorage x = new NumberStorage(5); //Arbiträres Objekt, das eine Zahl speichert.
 
   NumberStorage x = new NumberStorage(5); //Arbiträres Objekt, das eine Zahl speichert.
 
   System.out.println("x: "+x.getValue()); //Gibt aus: "x: 5"
 
   System.out.println("x: "+x.getValue()); //Gibt aus: "x: 5"
   callee(x); //Übergibt die Referenz von x and callee
+
   callee(x); //Übergibt die Referenz von x and callee (Call by Reference)
 
   System.out.println("x: "+x.getValue()); //Gibt aus: "x: 3"
 
   System.out.println("x: "+x.getValue()); //Gibt aus: "x: 3"
 
}
 
}
Zeile 19: Zeile 19:
 
}
 
}
 
</source>
 
</source>
 +
 +
In diesem Beispiel hat der Aufruf der Funktion <code>callee</code> Einfluss auf das übergebene Objekt außerhalb des eigendlichen Aufrufes, da das Objekt hinter der übergebenen Referenz geändert wird, und keine Kopie des übergebenen Objektes.

Version vom 26. September 2016, 18:04 Uhr

Unter Call by Reference versteht man das Übergeben von Objektreferenzen an Methoden.

Eine Variable mit einem Objektdatentyp speichert nicht das Objekt selbst, sondern nur eine Referenz auf dieses Objekt. Wird also eine Objektvariable an eine Methode übergeben, wird nur eine Kopie der Referenz auf ein Objekt übergeben, nicht jedoch eine Kopie des Objektes selbst. Dadurch haben anschließende Änderungen an Attributen des Objektes in der aufgerufenen Methode Einfluss auf die Attribute des Objektes außerhalb der Methode.

Alle Variablen, die dieselbe Referenz besitzen, erfahren dadurch die Änderungen an dem Objekt hinter der Referenz. Dies steht im Kontrast zu Variablen mit primitivem Datentyp. Ihr Wert wird immer direkt übergeben und nicht die Referenz auf den Speicherbereich, in dem der Wert zu finden ist (siehe Call by Value).

Beispiel

public static void caller(){
   NumberStorage x = new NumberStorage(5); //Arbiträres Objekt, das eine Zahl speichert.
   System.out.println("x: "+x.getValue()); //Gibt aus: "x: 5"
   callee(x); //Übergibt die Referenz von x and callee (Call by Reference)
   System.out.println("x: "+x.getValue()); //Gibt aus: "x: 3"
}

public static void callee(NumberStorage a){
   a.setValue(3); //Setzt den Wert des übergebenen Objektes auf 3
}

In diesem Beispiel hat der Aufruf der Funktion callee Einfluss auf das übergebene Objekt außerhalb des eigendlichen Aufrufes, da das Objekt hinter der übergebenen Referenz geändert wird, und keine Kopie des übergebenen Objektes.