call-by-reference-Effekt bei Objekten

Wang

Bekanntes Mitglied
Hallo! 🙂

Das Skript mit "call-by-value" habe ich soweit verstanden.
Allerdings habe ich so meine Schwierigkeiten mit dem Skript für den "call-by-reference-Effekt bei Objekten."

Wenn der Parameter kein primitiver Typ ist, sondern ein Objekt (also z.B. ein Array - was genau Objekte sind, betrachten wir später) dann wird zwar in der Methode ebenfalls mit einer Kopie des Parameters gearbeitet, aber es handelt sich um eine Kopie der Speicheradresse.

Java:
public class Reference
{
   public static void changeValues (int[] werte, int index, int wert)
   {
      werte[index] = wert;
   }

   public static void main (String[] args)
   {
      int[] werte = {0, 1, 2};
      changeValues (werte, 1, 3);
      System.out.println (werte[1]);   // Ausgabe?
   }
}

Obwohl also auch hier die Parameterauswertung nach dem Prinzip call-by-value erfolgt, ist der Effekt der gleiche wie bei call-by-reference. Wir werden auf diesen Effekt zurückkommen.

Die Ausgabe ist 3.

Mir ist das wirklich ein Rätsel, warum die Ausgabe hier 3 ist. ???:L
Kann mir bitte jemand kurz den Ablauf dieses Programms erklären, denn dann sollte ich das wohl begriffen haben?

Vielen Dank für die Mühe! 😉
 
Beil call-by-value hast du jeweils nur mit einer Kopie gearbeitet. Heisst es wurde eine neue Variable erzeugt.

Hier wird auch eine neue Variable erzeugt, aber jetzt hast du die Referenz. Stell es dir so vor:
Irgendwo im Memory, sagen wir an der Adresse 300 ist dein Array gespeichert. Wenn du jetzt den Array übergibst, übergibst du diese Adresse, 300.

Das heisst jetzt, dann wenn du mit dem Array in der Methode arbeitest, so arbeitest du mit der gleichen Adresse im Speicher. Wenn an der Stelle 300 nun etwas verändert wird, ändert sich das auch für ausserhalb der Methode.

Du machst in deinem Methodenaufruf jetzt eigentlich nichts anderes als das:
[Java]
werte[1] = 3
[/Java]

Da du die Referenz übergeben hast, ändert sich der Array auch für ausserhalb der Methode, da NICHT mit einer Kopie des Arrays gearbeitet wird, sondern direkt mit der Adresse von dem Array.

PS:
Die Adresse 300 ist natürlich frei erfunden, soll nur fürs Verständnis sein. Hoffe, dass dir das ganze dadurch etwas klarer wird.
 
nur so am rande... Java hat KEIN call-by-reference

java hat immer call-by-value... nur kann der value eine ojektreferenz sein
 

Neue Themen


Zurück
Oben