Call by Reference - Was stimmt denn nun ?

Status
Nicht offen für weitere Antworten.

sliwalker

Top Contributor
Hi,

eine Welt bricht zusammen.
Es gibt zwei Möglichkeiten:

1.
Ich hab es falsch verstanden.

2.
Entweder die FAQ oder der Java-Compiler lügt.

In der FAQ steht:

Java kennt kein "Call by Reference" !

Dies erkennt man wenn man sich die genaue Definitionen der beiden Aussagen betrachtet:

Zitat:
call by value
When you call a method, the method sees a copy of any primitives past to it. Thus any changes it makes to those values have no effect on the caller's variables. This also applies to references passed as parameters. The caller cannot change the caller's reference variables, but it can change the fields in the caller's objects they point to.

Zitat:
call by reference
When you call a method by reference, the callee sees the caller's original variables passed as parameters, not copies. References to the callee's objects are treated the same way. Thus any changes the callee makes to the caller's variables affect the caller's original variables. Java never uses call by reference. It always uses call by value.

Diese Meinung habe ich bis heute vehement vertreten und musste mich selbst, nach fast 3 stündigen Diskussionen darüber, mit meinem eigenen Beispiel vom Gegenteil überzeugen.
Ich habe auch den entsprechenden FAQ - Beitrag ausgedruckt und meinen Mitstudenten vorgelegt.
Aber seht selbst:

Code:
public class CallByReference
{

  public static void main(String[] args)
  {
  	Daten d = new Daten();
  	new Name(d);
  }
}

class Name
{
	
	public Name(Daten d)
	{
		System.out.println("Vorm Tausch: i=" + d.name + "  j=" + d.name2);
		Tausch t = new Tausch(d);
		System.out.println("Nach Tausch: i=" + d.name + "  j=" + d.name2); 
	}	
}

class Tausch
{
	
	public Tausch(Daten n)
	{	
		String tmp = n.name;
		n.name = n.name2;
		n.name2 = tmp;
	}
}

class Daten
{	
	String name;
	String name2;
	
	public Daten()
	{
		name = "Maik";
		name2 = "Hartmut";
	}
}

Ich habe eine Datenklasse mit zwei Strings. Die vertausche ich in der Klasse "Name" (stellt Controlebene dar) mithilfe der Klasse Tausch. Das Ergebnis ist, dass die Strings vertauscht sind.

Das Beispiel ist in der FAQ mit der Klasse "Integer". Was ja quasi dasselbe in grün ist.

Mein Lehrer sagt, dass bei Objekten per "Call by Referenz" übergeben wird.

Was stimmt denn nun?

greetz
SLi
 

Icewind

Bekanntes Mitglied
das liegt daran das Java die referenz auf das Objekt kopiert... und so kannst du die Werte des Objektes ändern...
 
B

Beni

Gast
Ich denke mal der wichtige Punkt ist das hier:
call by value
When you call a method, the method sees a copy of any primitives past to it. Thus any changes it makes to those values have no effect on the caller's variables. This also applies to references passed as parameters. The caller cannot change the caller's reference variables, but it can change the fields in the caller's objects they point to.
Und tatsächlich kannst du bei deinem Beisiel in dem Konstruktor von Tausch die Variable "d" im Konstruktor von Name nicht ändern.

Nur meine Interpretation, vielleicht es total anders :bae:
 

sliwalker

Top Contributor
Hoi,

thx.
Könntest Du das bitte noch ein bischen genauer beschreiben oder eine
Quelle angeben wo ich das genau nachlesen kann?

greetz
SLi
 

Icewind

Bekanntes Mitglied
mir is grad aufgefallen das man bei Call by Reference eine Referenz auf die Referenz hat... irgendwie eigenartig...
 

sliwalker

Top Contributor
Hoi,

Ich habe jetzt eine kurze Passage in einem meiner Bücher gefunden. :###
Das Buch heißt "Programmieren in Java" und ist 2002 im Hanser Verlag erschienen.
Autor Fritz Jobst.

Darin heißt es auf Seite 81:
Jede Variable in einem Java-programm, die ein Exemplar einer Klasse bezeichnet, ist eine referenz auf ein Exemplar der Klasse.

weiter
Die Übergabe als Parameter ist wie eine Wertzweisung implementiert.
Die gerufene Methode erhält also eine referenz auf das Exemplar.

hmmm...? :?:

greetz
SLi
 

Icewind

Bekanntes Mitglied
sliwalker hat gesagt.:
Darin heißt es auf Seite 81:
Jede Variable in einem Java-programm, die ein Exemplar einer Klasse bezeichnet, ist eine referenz auf ein Exemplar der Klasse.

naja jede Variable die du hast ist die Referenz auf ein Objekt, in der Variable steht die Speicheradresse im Arbeitsspeicher der VM drinn (so weit ich das weis).

sliwalker hat gesagt.:
weiter
Die Übergabe als Parameter ist wie eine Wertzweisung implementiert.
Die gerufene Methode erhält also eine referenz auf das Exemplar.

Naja der Methode wird die Referenz auf das Objekt kopiert, dh sie besitzt dann auch eine Referenz auf das Objekt.
 

sliwalker

Top Contributor
Hmm, nagut.

Aber warum steht dann in der FAQ, dass Java kein CallByReference kennt?

Aber dank dir erstmal ;)

greetz
SLi
 

Icewind

Bekanntes Mitglied
weil es das nicht gibt in Java...

Call by Reference eine Referenz auf die Referenz des Objektes übergeben werden würde , ka wie das intern funktioniert aber so kann man sich das in etwa vorstellen.

dh:

Code:
Objekt a = new Objekt();
Objekt b = new Objekt();
tausche(a,b);

void tausche(Objekt &a,Objekt &b)            //das wäre eine referenzübergabe in C
{
    Objekt c=b;
    b=a;
    a=c;
}

jetzt würde die Referenz a auf das Objekt der Referenz b zeigen das geht allerdings nicht in Java weil bei einer Methode die Referenz auf das Objekt kopiert und nicht eine Referenz auf die Referenz des Objektes übergeben wird...

irgendwie klar jetzt??
 

sliwalker

Top Contributor
Abschließend:

Ich finds echt lustig.
Das ist doch verarsche.

Wie bereits erwähnt, sind Objektvariablen Referenzen, also Zeiger. Zwar werden auch sie bei der Übergabe an eine Methode per Wert übergeben. Da innerhalb der Methode aber der Zeiger auf das Originalobjekt zur Verfügung steht (wenn auch in kopierter Form), wirken sich Veränderungen an dem Objekt natürlich direkt auf das Originalobjekt aus und sind somit für den Aufrufer der Methode sichtbar. Wie in allen anderen Programmiersprachen entspricht die call by value-Übergabe eines Zeigers damit natürlich genau der Semantik von call by reference.

Das stammt aus Guido Krügers Java Handbuch^^.
www.java-buch.de


greetz
SLi
 
B

bygones

Gast
@sliwalker:

wie schon gesagt - Java kennt kein Call by Reference. Warum es bei dir klappt ist, weil du auf INstanzvariablen arbeitest...

Wenn es doch CbR geben sollte - schreiben mir eine solche Swap Methode, die nicht auf Instanzvariablen basiert !!!
 

sliwalker

Top Contributor
Hoi,

Du hast ja Recht.
Es kam bei mir nur nicht direkt so deutlich an.
Ich habe ja Deine Meinung vertreten, bevor ich
zusammen mit jemanden dieses Beispiel gemacht haben.

Er wollte mich vom Gegenteil überzeugen.
Was er kurzfristig ja auch geschafft hat.

greetz
SLi
 
B

bygones

Gast
aber danke für den Hinweis - werde es mal in den FAQ beitrag einbauen....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java - Call by value <-> Call by reference Allgemeine Java-Themen 16
E wie call by reference mit Wrapper-Klassen? Allgemeine Java-Themen 2
H Aus der FAQ: Call by Value <-> Call by Reference Allgemeine Java-Themen 8
A Java Call-Hierarchie Allgemeine Java-Themen 2
V JNI Call Crash verhindern (abfangen) Allgemeine Java-Themen 2
K Als Rückgabewert ode call by referenz was ist sauberer? Allgemeine Java-Themen 12
J InvocationException im Thread (innerhalb von call() einer Callable Klasse) Allgemeine Java-Themen 2
hdi ClassLoader / Constructor Call intern Allgemeine Java-Themen 11
S Performance und Function Call Depth Allgemeine Java-Themen 6
MQue call by value Allgemeine Java-Themen 5
P call by value/referenz Allgemeine Java-Themen 4
N Sieht aus wie ein "Call by Referece/Call by Value" Allgemeine Java-Themen 7
S Active-X Call / Invoke?` Allgemeine Java-Themen 7
S Call by Value Allgemeine Java-Themen 9
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
R Erste Schritte Object reference funktioniert nicht. Wie mach ichs richtig? Allgemeine Java-Themen 3
M Lambda "invalid method reference no suitable method found" Allgemeine Java-Themen 2
W Threads Cannot make a static reference.. Allgemeine Java-Themen 13
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
Kr0e Circular reference - Serialisierung Allgemeine Java-Themen 6
Schandro Warum illegal forward reference bei Exemplarinitialisierer Allgemeine Java-Themen 9
F Pointer oder Reference? Allgemeine Java-Themen 8
G Reference-Counter Allgemeine Java-Themen 3
B Array von Vektoren by reference übergeben Allgemeine Java-Themen 5
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
A Static reference to non-static field Allgemeine Java-Themen 10
O Pointer/reference on method Allgemeine Java-Themen 10
simon1101 Überprüfen ob Dateiendung stimmt Allgemeine Java-Themen 4
V Hm Denkfehler? oder was stimmt da nicht? Allgemeine Java-Themen 2
P if Bedingung stimmt irgendwie net. Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben