Java Tutorial #16

Ist Java pass-by-value oder pass-by-reference?

2018-12-03 | credit: grki/ adobe

Thema in Kurzform

Java ist pass-by-value!

Bei Parameter von primitiven Datentypen bedeutet pass-by-value, dass die Werte der übergebenen Argumente beim Methodenaufruf in die Parametervariablen kopiert werden.

Sind die Parameter Objektypen, bedeutet pass-by-value, dass die Verweise auf die Objekte kopiert werden.

pass-by-value bei primitiven Datentypen

Immer dann, wenn wir eine Methode mit Parameter aufrufen, werden die Werte der übergebenen Argumente in die Parametervariablen kopiert. Was das bedeutet, sehen wir hier:

public class Demo {

    public static void methodeMitParameter(int x){
        x += 2; // 3
    }

    public static void main(String[] args){
        int zahl = 1;
        methodeMitParameter(zahl);
        System.out.println(zahl); //1
    }
}

In der Main-Methode definieren wir zum Testen eine int-Variable zahl mit dem Wert 1. Wir rufen jetzt die statische Methode methodeMitParameter auf und übergeben als Argument die Variable zahl.

Jetzt geschieht Folgendes: Die Parametervariable x wird mit dem Wert von zahlinitialisiert. Mit anderen Worten: Der Wert von zahl wird in x kopiert. Beide Variablen haben jetzt als Wert die Ganzzahl 1.

Aber: Es gibt keine Verbindung zwischen den beiden Variablen! Was auch immer innerhalb der Methode mit der Variablen x passiert: Es hat keine Auswirkungen auf die Variable zahl. Es sind zwei völlig voneinander unabhängige Variablen. Das sehen wir ja daran, dass sich der Wert von x in der Methode ändert (wird zu 3). Die Variable zahl geht das jedoch nichts an und sie behält ihren Wert 1.

Somit ist Pass-by-Value immer Pass-by-Copy.

pass-by-value bei Objekttypen

Etwas anders verhält es sich, wenn wir Methoden aufrufen, die Objekte als Argumente verlangen. Dann werden nicht die Objekte selbst, sondern die Verweise darauf kopiert. Man spricht hier auch von "Call-by-Value where the value is a reference". 

Nach der Übergabe des Objekts in die Methode hat man also zwei Referenzvariablen, die beide auf dasselbe Objekte verweisen.

Schauen wir uns das mal praktisch an:

public class Metroid {

    public int energie = 10;

    public static void methodeMitParameter(Metroid mP){
        mP.energie = 20;
    }

    public static void main(String[] args){
        Metroid metroid = new Metroid();
        methodeMitParameter(metroid);
        System.out.println(metroid.energie); //20
    }

}

Die statische Methode verlangt beim Aufrufen mit dem Parameter mP ein Objekt der Klasse Metroid. In der Methode wird dann der Wert der Instanzvariable energie dieses Objekts auf 20 geändert.

Was geschieht genau, wenn wir die Methode aufrufen? Nicht das übergebene Objekt selbst wird kopiert, sondern die Referenz auf dieses Objekt. Es gibt nun zwei Referenzvariablen, die auf das eine Metroid-Objekt zeigen, nämlich die Variable mP (der Parameter) und die Variable metroid.

Bildlich kann man sich das Ganze so vorstellen:

Java pass by value

Beide Variablen können auf das Objekt unabhängig voneinander zugreifen und es verändern, denn beide verweisen darauf.

Werbung

Java lernen

Werde zum Java Profi!

PHP Lernen

Lerne serverbasierte Programmierung

JavaScript lernen

Skille dein Webcoding

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen