call by Value
-
Hallo, mein Prof meinte aber, dass sich auch mit Objekten kein echtes
Call by referance simulieren lasse. Also muss es zu echtem Call by referance
ein Unterschied geben --- aber welchen?ps. Er meinte um echtes Call by reference zu simulieren bräuchte man Zeiger auf Zeiger. Aber warum?
-
Original erstellt von <MisterX>:
**Es werden auch Zeiger auf Objekte übergeben. Dies würde aber "Seiteneffekt"
genannt, weil es Unterschide zu echtem Call by reference gibt.
**zeiger werden in Java nicht üebrgeben. Nur Referenzen. Zeiger kennt Java nicht, denn mit Zeigern müsste man mehr machen können als man mit Referenzen kann.
Original erstellt von <MisterX>:
ps. Er meinte um echtes Call by reference zu simulieren bräuchte man Zeiger auf Zeiger. Aber warum?Das würde implizieren, dass die Sprache es erlaubt, Referenzen auf Zeiger überhaupt zu haben bzw. überhaupt die Existenz von Zeigern zu erlauben. Also in meinem Studium wurde mit beigebracht, dass Java durchaus bei Objekten call-by-reference macht. Die Sprache erlaubt halt nur bei Objekten call-by-reference.
[ Dieser Beitrag wurde am 27.04.2003 um 22:36 Uhr von TriPhoenix editiert. ]
-
Nur Referenzen. Zeiger kennt Java nicht
naja, meiner Meinung nach sind Objektvariablen in Java im Prinzip dasselbe wie Zeiger auf Objekte in C++ (ich schätz mal das sie sogar wirklich Speicheradressen beinhalten), nur nennt man sie nicht Zeiger (böses Wort) sondern Referenzen.. nur gibts halt keine Zeigerarithmetik und so Sachen.. das Verhalten bei Paramterübergabe von Objektvariablen ist im Prinzip identisch wie bei C++ die Übergabe eines Zeigers. Daher muß man auch einen Zeiger auf Zeiger (Objekt auf Objekt) übergeben um "echtes Call by Reference" zu erzeugen (wie bei C : um einen Zeiger zu ändern muß man einen Zeiger auf ihn übergeben)
-
Kurz gesagt, wenn man ein Objektt als Parameter übergibt, ändert sich die übergebene Variable dann, wenn im Code der Methode die den Parameter empfängt, dieser Parameter mit dem .-Operator oder wenns ein Array ist mit dem [] -Operator bearbeitet wird..wenn der Paramter selber mit =-Operator verändert wird dann nicht
void method (Parameter para,Parameter[] array) { para.variable=5; // Änderung para= new Parameter(); // keine Änderung array[0]=new Parameter(); //Änderung array= new Parameter[100]; //keine Änderung }
hoffe des bringt jetz etwas klarheit;)
[ Dieser Beitrag wurde am 28.04.2003 um 01:08 Uhr von crass editiert. ]
-
Original erstellt von crass:
nur gibts halt keine Zeigerarithmetik und so Sachen..Und genau das unterscheidet Zeiger von Referenzen. Mit ersteren kann man rumspielen etc. während Referenzen wirklich an ein tatsächliches Objekt gebunden sind.
das Verhalten bei Paramterübergabe von Objektvariablen ist im Prinzip identisch wie bei C++ die Übergabe eines Zeigers.
Nein, das Verhalten ist im Prinzip identisch wie in C++ die Übergabe von Referenzen (Mit & vorm Parametername).
Daher muß man auch einen Zeiger auf Zeiger (Objekt auf Objekt) übergeben um "echtes Call by Reference" zu erzeugen
Wenn es keine Zeiger gibt, braucht man darauf auch keine Zeiger übergeben können. Und wovon man Referenzen erzeugen kann liegt im Ermessen der Sprache. Im Übrigen kann man ein Objekt auf ein Objekt wunderbar machen:
[java]
public object ObjectKapsel {
public Object o;
}[/code]Kein Problem da :p
-
Nein, das Verhalten ist im Prinzip identisch wie in C++ die Übergabe von Referenzen (Mit & vorm Parametername).
da bin ich anderer Meinung, in meinem Beispiel von oben, die Methode, würde nämlich in C++ mit Referenzen in allen 4 Fällen die übergebene Variable ändern, bei Übergabe von Zeigern wär das Verhalten dagegen genauso
-
Original erstellt von crass:
da bin ich anderer Meinung, in meinem Beispiel von oben, die Methode, würde nämlich in C++ mit Referenzen in allen 4 Fällen die übergebene Variable ändern, bei Übergabe von Zeigern wär das Verhalten dagegen genausoIrrtum. Es kompiliert nicht einmal. Du kannst Referenzvariablen keine neuen Variablen in dieser Art zuweisen, es gibt kein Sprachkonstrukt dafür. Man kann nur über die Referenz auf Variablen des Objektes zugreifen.
-
ich meinte sinngemäß angepasst nicht buchstabe für buchstabe...außerdem schon allein daß man bei referenzen den code ändern müßte bei Zeigern aber nicht (abgesehen davon daß man -> Operator statt .Operator verwenden würde), zeigt doch eigentlich daß Java-Objekte viel mehr mit Zeigern als mit Referenzen gemeinsam haben
-
Original erstellt von crass:
**ich meinte sinngemäß angepasst nicht buchstabe für buchstabe...
**Habe ich versucht. Man kann in C++ eine Referenz nicht so einfahc auf eine neue Variable zeigen lassen. Das einzige was man machen kann, ist eine zweite Variable vom selben Typ anzulegen und diese dann per = zuweisen. Das ist dann aber auch nur der Kopieroperator und ist deswegen zu meiner Theorie kompatibel.
**
außerdem schon allein daß man bei referenzen den code ändern müßte bei Zeigern aber nicht (abgesehen davon daß man -> Operator statt .Operator verwenden würde), zeigt doch eigentlich daß Java-Objekte viel mehr mit Zeigern als mit Referenzen gemeinsam haben**Sehe ich noch immer nicht so. Das zeigt nur, dass die Sprachen C++ und Java verschiedene Sprachkonstrukte haben. Denn der einzige grundsätzliche Unterschied ist, dass Zeiger noch Zeigerarithmetik haben und Referenzen nicht. Im übrigen kann man das ganze auch semantisch sehen:
- Zeiger bezeichnen einen Speicherbereich udn zeigen jeweils irgendwo hin (meistens natürlich auf sinnvolle Daten, aber nicht zwingend).
- Referenzen bezeichnen ein Objekt und nichts anderes (ausnahme: ein spezielles null-objekt). Referenzen können nur auf gültige Objekte und das Nullobjekt gesetzt werden und auf nichts anderes.Java benutzt eindeutig zweiteres. Hinetr den Referenzen stecken zwar zwangsläufig immer Zeiger, aber die Sprache erlaubt keinen Zugriff darauf und damit ist es aus Benutzersicht eine Referenz. Denn Java könnte intern ja auch eine Tabelle halten in der die Speicherstellen der Objekte stehen und in die Referenzvariablen nur die Tabellenindizes schreiben. Für das Java-Programm macht das keinen Unterschied. Wenn man das in ienem C-Programm mit Zeigern macht, macht das einen dramatischen Unterschied.
[ Dieser Beitrag wurde am 28.04.2003 um 14:21 Uhr von TriPhoenix editiert. ]
-
Nagut ich glaub die Diskussion führt zu nix mehr;)
Java-Objektvariablen sind weder idenisch mit C++Zeigern noch mit C++Referenzen, ob es jetzt eher das eine oder das andere ist, is ja auch eigentlich gar nicht so wichtig. Man sollte halt mit ihnen umgehen können