Passing Reference by Value

Status
Nicht offen für weitere Antworten.

chrs

Mitglied
Code:
public class Test extends Object {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("XYZ");
        list.add("ABC");
        list.add("GHI");

        System.out.println();

        System.out.println(list);
        removeFirst(list);
        System.out.println(list);

        Integer o = 3;
        System.out.println(o);
        changeValue(o);
        System.out.println(o);
    }

    static void removeFirst(List<String> list) {
        list.remove(0);
    }

    static void changeValue(Integer i) {
        i = 12;
    }
}

Hallo,

ich verstehe einfach nicht warum das Objekt auf das die Referenz bei removeFirst zeigt verändert werden kann, und bei changeValue nicht?

Ich habe bereits zwei Artikel zu diesem Thema gelesen werde aber nicht schlau daraus.
http://www.java-forum.org/de/viewtopic.php?t=5390
http://www.yoda.arachsys.com/java/passing.html

Schön wenn es mir jemand erklärt..
 
Bei removeFirst änderst du den inneren Zustand des Objekts "list". Diese Änderung bleibt auch nach Verlassen der Methode bestehen.
changeValue macht was ganz anderes. Hier wird der Variablen i (eigentlich ein Parameter) lokal innerhalb der Methode ein neuer Wert zugewiesen. Diese Zuweisung hat aber nichts mit der Variablen o zu tun, die beim Methodenaufruf als Argument übergeben wurde. Es wurde nur die Referenz "by value" kopiert.
Call by reference gibt es nicht in Java.
 
Du uebergibst nur eine Referenz... einen Griff auf ein Objekt. bei removeFirst() nimmst du die Referenz und veraenderst das Objekt. Bei changeValue() veraenderst du die Referenz, nicht das Objekt. Das interessiert die urspruengliche Referenz in deiner main() aber nicht die Bohne.
 
Es wird vielleicht klarer wenn man sich aufschreibt, was diese Codes machen.

list.remove( 0 ):
1. Lade Referenz "list" (Objekt wird vorgemerkt)
2. Benutze 1. um Methode "remove" zu finden
3. Lade int 0.
4. Benutze 2 und 3 um Methode aufzurufen.

i = 12:
1. Lade int 12
2. Lade Integer-Objekt das 12 entspricht (Autoboxing)
3. Schreibe 2. in Referenz "i"


Der Unterschied? Beim ersten Code wird "list" geladen, beim zweiten Code wird "i" beschrieben. Beim zweiten gibt es nie einen Zugriff auf das Objekt auf das i verweist, wie soll es dann verändert werden?
 
musiKk hat gesagt.:
Du uebergibst nur eine Referenz... einen Griff auf ein Objekt. bei removeFirst() nimmst du die Referenz und veraenderst das Objekt. Bei changeValue() veraenderst du die Referenz, nicht das Objekt. Das interessiert die urspruengliche Referenz in deiner main() aber nicht die Bohne.

Danke an alle für die Antworten, aber die Antwort hats echt super verständlich gemacht ... endlich habe ich es verstanden.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben