Java, Programmieren

Werte oder Referenzen an Java-Methoden übergeben

Ein Phänomen bringt vor allem Programmiereinsteiger häufig zur Verzweiflung: Man übergibt ein Array als Parameter an eine Methode, die daraufhin Werte innerhalb dieses Arrays verändert. Stellen wir uns als Beispiel vor, wir hätten ein Array mit zufälligen, ganzen Zahlen (Integer), das wir von einer bestimmten Methode sortieren lassen möchten. Wir schreiben also:

int[] sortiert = sortiere(unsortiert);

Erfreut stellen wir fest, dass sich im Array sortiert die Zahlen in der richtigen Reihenfolge befinden. Aber was ist mit unsortiert passiert? Das sollte ja eigentlich gar nicht verändert werden, schließlich wurde es doch nur als Parameter übergeben. Mysteriöserweise ist es nun aber ebenfalls sortiert!

Werte oder Referenzen?

Man hört oder liest immer wieder, dass in Java manchmal Werte übergeben werden, quasi als Kopie, manchmal nur die Referenzen, also sozusagen die Adressen von gespeicherten Werten. Das klingt auch plausibel. Sage ich einer Methode also: „Hier ist eine 5, berechne damit etwas!“, dann habe ich der Methode den Wert übergeben. Die Methode speichert den Wert lokal und kann ohne große Auswirkungen daran herumspielen. Sage ich aber: „Berechne etwas mit dem Wert, der an der Speicheradresse 23 steht“, dann erkennt man das Problem. Wird der dortige Wert verändert, betrifft das natürlich auch alle anderen Beteiligten, die den Wert an der Speicheradresse 23 nutzen.

Wann werden denn Werte und wann werden Referenzen übergeben?

Genau genommen übergibt Java immer nur Werte. Die Frage ist, was sind das für Werte? Die klassischen, primitiven Datentypen int, char, booleanusw. enthalten z.B. lediglich ihre Werte. Alle anderen Datentypen werden in Java aber als Objekt gehandhabt, das gilt auch für Arrays! Und Objekte werden immer über ihre Objektreferenz angesprochen. Da ist also so etwas wie eine Speicheradresse und diese Adresse hat natürlich einen konkreten Wert. Übergibt man in Java also ein Array (oder ein anderes Objekt) an eine Methode, so übergibt man genau genommen den Wert der Adresse des Arrays.

Fazit: Sobald ich etwas anderes als primitive Datentypen übergebe, muss ich aufpassen!

Kann man denn selber eine Kopie erstellen?

Na klar! Im Falle von Arrays ist das sogar ganz intuitiv möglich, aber auch mit den Bordmitteln von Java. Zunächst die intuitive Variante für Selbermacher: Man deklariert einfach ein neues, gleich großes Array und überträgt mittels for-Schleife alle Werte 1 zu 1:

Oder man bindet die Java-eigene Klasse Arrays ein und nutzt dessen Methode copyOf(a, b), wobei a hier das Original-Array und b dessen Länge sein soll:

Gibt’s das nur für Arrays oder auch für beliebige Objekte?

Beliebige Objekte lassen sich natürlich nicht einfach per for-Schleife kopieren. Trotzdem wäre es aber genauso möglich, ein neues Objekt derselben Klasse zu erzeugen und alle Werte einzeln zu übertragen. Hier sind aber die Bordmittel von Java sicherlich praktischer, aber das Problem ist nicht zu unterschätzen: Was ist, wenn ein Objekt selbst wieder Referenzen auf andere Objekte enthält? Sollen von diesen referenzierten Objekten dann auch wiederum Kopien erstellt werden?

Hierzu werde ich in Kürze noch etwas mehr schreiben!

Schreibe eine Antwort