Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Java ::  Argumente als Referenz und gutes Java Buch  
Gehen Sie zu Seite Zurück  1, 2, 3  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Korrektor
Unregistrierter




Beitrag Korrektor Unregistrierter 07:27:25 01.12.2011   Titel:              Zitieren

LordJaxom schrieb:
Korrektor schrieb:
Objekte, auch Datentypen die ein Objekt sind, z.B. String oder Integer werden immer als Referenz übergeben.


Referenzen auf Objekte werden genau wie Primitive per Value übergeben. Wenn irgendwas per Referenz übergeben würde, wäre folgendes möglich:

Java:
1
2
3
4
5
6
7
8
void fillString(String value)
{
    value = "Hallo";
}
 
String x;
fillString(x);
assert x.equals("Hallo");


Okay, aber ich halte dagegen bezüglich der Arrays:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class CopybyReference{
    public static void change(int[] a){
        a[0] = 0;
        a[1] = 0;
        a[2] = 7;
    }
 
    public static void main(String[] args){
        int[] feld = {0, 1, 2};
        change(feld);
        System.out.print("feld = { ");
        for (int element: feld){
            System.out.print(element + ", ");
        }
        System.out.print("}\n");       
    }
}
LordJaxom
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5703
Beitrag LordJaxom Mitglied 07:56:57 01.12.2011   Titel:              Zitieren

Das Beispiel ist nicht analog. Klar, dass man das referenzierte Objekt ändern kann (weil die Referenz ja übergeben wird - wie ist an der Stelle egal). Das gilt für Arrays ja genauso wie für alle anderen Referenztypen. Die Referenz kann man aber nicht ändern, da diese by-value übergeben wird, siehe:

Java:
public static void change(int[] a){
   a = new int[] { 0, 0, 7 };
}
 
int[] feld = new int[] { 1, 2, 3 };
change(feld);
assert feld[2] == 7;
Korrektor
Unregistrierter




Beitrag Korrektor Unregistrierter 08:16:39 01.12.2011   Titel:              Zitieren

LordJaxom schrieb:
Korrektor schrieb:
Objekte, auch Datentypen die ein Objekt sind, z.B. String oder Integer werden immer als Referenz übergeben.


Referenzen auf Objekte werden genau wie Primitive per Value übergeben. Wenn irgendwas per Referenz übergeben würde, wäre folgendes möglich:

Java:
1
2
3
4
5
6
7
8
void fillString(String value)
{
    value = "Hallo";
}
 
String x;
fillString(x);
assert x.equals("Hallo");


So, ich habe nochmal recherchiert.

Das Problem ist, daß deine Schlußfolgerung falsch ist.

Objekte werden in Java immer als Referenz an eine Methode übergeben. Der Grund warum dein Beispiel nicht funktioniert, ist ein völlig anderer und zwar der, daß
mit value = "Hallo"; ein komplett neuer String erstellt wird, der nun dem lokalen Referenzhalter zugewiesen wird.
Es ist in Java also nicht wie in C/C++ möglich, bestehende Strings zu verändern, sondern es wird immer ein neuer angelegt und die Variable auf den neuen Eintrag referenziert.

Siehe auch:
http://docstore.mik.ua/orelly/java-ent/jnut/ch02_10.htm

Und die Punkte:
Zitat:

In Java, primitive types are always handled exclusively by value, and objects and arrays are always handled exclusively by reference.


und

Zitat:

Although references are an important part of how Java works, Java programs cannot manipulate references in any way.
Korrektor
Unregistrierter




Beitrag Korrektor Unregistrierter 08:19:16 01.12.2011   Titel:              Zitieren

Oder um es anders zu sagen, vor deiner
value = "Hallo";

Zuweisung, zeigt value immer noch auf die gleiche Adresse wie x in der main Methode.

x wird also nicht bei er Übergabe kopiert.
Wenn es kopiert werden würde, dann würde value zu Beginn auch auf eine ganz andere Adresse zeigen und der Inhalt trotzdem identisch sein.
Korrektor
Unregistrierter




Beitrag Korrektor Unregistrierter 08:28:51 01.12.2011   Titel:              Zitieren

Siehe auch dieses Codebeispiel:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Test {
   
    static String b;
   
    public static void change(String s){
        if (b == s){
            System.out.println("b und s zeigen auf die gleiche Adresse!");
            s = "hallo";
        }
       
        if (b != s){
            System.out.println("b und s zeigen nun nicht mehr auf die gleiche Adresse");
        }
    }
    /**
     * @param args
     */

    public static void main(String[] args) {
        b = "Blubber";
 
        change(b);
 
    }
}


Ausgabe:
Code:
b und s zeigen auf die gleiche Adresse!
b und s zeigen nun nicht mehr auf die gleiche Adresse


Der String wird also by Reference an die Methode übergeben und nicht by Value.
Würde er by Value übergeben werden, so dürfte die erste Zeile nicht ausgegeben werden.


Ich lag in meinem ersten Posting also richtig.
Nur primitive Datentypen werden kopiert, alle anderen werden by Reference übergeben.

Und warum dein zuvor aufgezeigtes Beispiel kein Beweis für deine Vermutung ist, liegt daran, weil dort etwas ganz anders mit der lokalen variable passiert, wie oben beschrieben.
Korrektor
Unregistrierter




Beitrag Korrektor Unregistrierter 08:40:11 01.12.2011   Titel:              Zitieren

LordJaxom schrieb:
Das Beispiel ist nicht analog. Klar, dass man das referenzierte Objekt ändern kann (weil die Referenz ja übergeben wird - wie ist an der Stelle egal). Das gilt für Arrays ja genauso wie für alle anderen Referenztypen. Die Referenz kann man aber nicht ändern, da diese by-value übergeben wird, siehe:

Java:
public static void change(int[] a){
   a = new int[] { 0, 0, 7 };
}
 
int[] feld = new int[] { 1, 2, 3 };
change(feld);
assert feld[2] == 7;


Die Referenz selbst wird by value übergeben, das sehe ich auch so, aber nicht das Objekt, denn das wird per Referenz übergeben.

Und falls die lokale Referenzvariable nur lesend benutzt wird, zeigt sie immer noch auf das lokale Objekt. Das Objekt wurde also niemals kopiert.
Korrektor
Unregistrierter




Beitrag Korrektor Unregistrierter 08:41:20 01.12.2011   Titel:              Zitieren

Korrektur:


Und falls die lokale Referenzvariable nur lesend benutzt wird, zeigt sie immer noch auf das ursprüngliche Objekt. Das Objekt wurde also niemals kopiert.
LordJaxom
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5703
Beitrag LordJaxom Mitglied 08:46:03 01.12.2011   Titel:              Zitieren

Langer Rede kurzer Sinn, wir sind uns einig, dass Referenzen by-value übergeben werden. Ich habe nichts anderes behauptet.
Korrektor
Unregistrierter




Beitrag Korrektor Unregistrierter 08:51:24 01.12.2011   Titel:              Zitieren

LordJaxom schrieb:
Langer Rede kurzer Sinn, wir sind uns einig, dass Referenzen by-value übergeben werden. Ich habe nichts anderes behauptet.


Also wir sind uns zwar einig, aber ursprünglich hast du auf meinen Satz:

Zitat:

Objekte, auch Datentypen die ein Objekt sind, z.B. String oder Integer werden immer als Referenz übergeben.


folgendermaßen geantwortet:
Zitat:

Referenzen auf Objekte werden genau wie Primitive per Value übergeben. Wenn irgendwas per Referenz übergeben würde, wäre folgendes möglich:


Der erste Satz ist noch ok und könnte als Ergänzung durchgehen, aber der zweite ist ein Widerspruch zu meinem Gesagten.
Denn "irgendwas" schließt auch Objekte mit ein.

Ich sprach von Objekten, du von Referenzen.


Fassen wir also zusammen:

Objekte und Arrays werden immer als copy by Referenz übergeben, genau wie ich sagte.
Referenzen werden als copy by value übergeben, so wie du sagtest.
Und primitive Datentypen werden immer als copy by value übergeben.
LordJaxom
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5703
Beitrag LordJaxom Mitglied 08:59:37 01.12.2011   Titel:              Zitieren

Ich stimme zu, wobei der erste Kernsatz aus dem zweiten hergeleitet werden kann, da Objekte und Arrays in Java ausschließlich als Referenz vorliegen können.
c++.de :: Java ::  Argumente als Referenz und gutes Java Buch  
Gehen Sie zu Seite Zurück  1, 2, 3  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.