Wie kann ich call by reference umgehen?

Status
Nicht offen für weitere Antworten.

fab!

Mitglied
Hallo zusammen!

Ich weiß das Java kein call by reference bietet, aber wie kann ich dieses umgehen???

Mein Beispiel:
Code:
public class Knoten{
	int m_Wert;

	public Knoten(){
		m_Wert = 0;
	}
}
Code:
public class Baum {
	public Knoten m_Wurzel;
	public Baum(){			
		m_Wurzel = null;
	}
	public void Hinzufuegen(Knoten foo){
		if(foo == null){
			foo = new Knoten();
			foo.m_Wert = 10;
		}
		else{
			//mach was...
		}
	}
}
Code:
public class Main {
	public static void main(String[] args) {
		Baum DerBaum = new Baum();
		DerBaum.Hinzufuegen(DerBaum.m_Wurzel);
		System.out.println(DerBaum.m_Wurzel.m_Wert); // sollte 10 sein...
	}
}

Der Haken ist im zweiten Code-Block:
Wenn ich der Methode Hinzufuegen ein "null-Knoten-Object" übergebe, möchte ich es mit new erzeugen...

Wie kann ich sowas in Java realisieren???
(Mit call by reference in z.B. c++ wäre dies kein Problem...)

Bin für jede Hilfe dankbar!!!
Gruß
Fabian
 

moormaster

Top Contributor
fab! hat gesagt.:
Hallo zusammen!

Ich weiß das Java kein call by reference bietet, aber wie kann ich dieses umgehen???

Mein Beispiel:
Code:
public class Knoten{
	int m_Wert;

	public Knoten(){
		m_Wert = 0;
	}
}

Wie werden die Knoten zu einem Baum verknüpft, wenn Sie weder Nachfolgeknoten noch Vorgänger speichern?

Code:
public class Baum {
	public Knoten m_Wurzel;
	public Baum(){			
		m_Wurzel = null;
	}
	public void Hinzufuegen(Knoten foo){
		if(foo == null){
			foo = new Knoten();
			foo.m_Wert = 10;
		}
		else{
			//mach was...
		}
	}
}

Gerade der else Zweig wäre interessant, um sehen zu können, warum welches Ergebnis herauskommt...

Der Haken ist im zweiten Code-Block:
Wenn ich der Methode Hinzufuegen ein "null-Knoten-Object" übergebe, möchte ich es mit new erzeugen...

folgendes geht in Java NICHT:

Code:
  public static void add(Vertex v)
  {
   if (v == null)
   {
    v = new Vertex();
   }

   // tu was
  }

  // Aufruf:
  Vertex myVertex = null;
  add(myVertex);
  // myVertex ist hier immernoch null, da add die Referenz nicht auf ein anderes Objekt verändern kann

das hingegen geht:


Code:
  public static Vertex add(Vertex v)
  {
   if (v == null)
   {
    v = new Vertex();
   }

   // tu was

   return v;
  }

  // Aufruf:
  Vertex myVertex = null;
  mýVertex = add(myVertex);
  // myVertex == Referenz auf gültiges Vertex Objekt != null


Allerdings frage ich mich, wieso deine Hinzufügen Methode (die ja offensichtlich zu einer Baumstruktur gehören soll) nur ein einziges Knotenobjekt als Parameter erwartet.

Dort übergibt man doch normaler Weise einen Elternknoten sowie den hinzuzufügenden Wert. Sprich man muss dann die Referenz des Elternknotens nicht verändern, sondern die Methode würde immer einen neuen Knoten mit dem gegebenen Wert als Inhalt erzeugen und diesen Knoten dann mit dem Elternknoten verknüpfen.

Evtl. kann der Rückgabewert der Funktion die Referenz auf den neuen Knoten zurückgeben.

Daher weiss ich nicht wirklich, wo da nun dein Problem liegt :D


Wie kann ich sowas in Java realisieren???
(Mit call by reference in z.B. c++ wäre dies kein Problem...)

Bin für jede Hilfe dankbar!!!
Gruß
Fabian[/quote]
 

nebulo

Bekanntes Mitglied
Ich verstehe ehrlich gesagt dein Problem nicht und weiß nicht genau was du machen willst und was nicht funktioniert. Versuch mal zu erklären was dass Problem ist.
 

fab!

Mitglied
Danke erstmal für die Antworten...

Wie "moormaster" schon richtig erkannt hatte gehört das alles zu einer Baumstruktur, wollte es nur vereinfacht darstellen um mein Problem offensichtlicher zu machen, aber das gieng wohl schief ;-)

also hier nochmal der etwas ausführlichere Code meiner Hinzufügen-Methode:

Code:
public void Hinzufuegen(Knoten foo, int Wert){
      if(foo == null){
         foo = new Knoten();  // Nix gut, da es lediglich eine KOPIE des foo Objektes ist...
         foo.m_Wert = Key;
      }
      else{
         if(Wert < foo.m_Wert){
              this.Hinzufuegen(foo.m_Left,Wert);
         }
         else if(Wert > foo.m_Wert){
              this.Hinzufuegen(foo.m_Right,Wert);
         }
         else{
         //Fehler... Knoten schon vorhanden? 
         }
      }
   }
Selbstverständlich hat ein Knoten-Objekt 2 Membervariablen vom Typ Knoten, die wiederum auf ein Knoten-Objekt verweisen...

Meine Hinzufuegen-Methode sollte den Baum rekursiv von der Wurzel durchlaufen und ein neues Knoten-Objekt an die entsprechende Stelle einfügen, deswegen bräuchte ich "call by reference"...
Ist mein Problemchen jetzt verständlich geworden?



Code:
public static Vertex add(Vertex v)
  {
   if (v == null)
   {
    v = new Vertex();
   }

   // tu was

   return v;
  }
Sowas kam mir vorhin auch schon in den Sinn, werde es nachher gleich mal testen...


Gruß
Fabian
 

ARadauer

Top Contributor
fab! hat gesagt.:
Ich weiß das Java kein call by reference bietet, aber wie kann ich dieses umgehen???

wer sagt das? nur übergibst du keine refernz sondern null. übergib mal den ganzen baum und füg dann den knoten ein bzw nur den vaterknoten. oder wie schon gesagt gibt den knoten zurück beim erstellen.


ich nenn sowas schon call by reference.
Code:
public class Test {
	public static void main(String[] args) {
		Container c = new Container();
		c.setWert(99);
		System.out.println(c.getWert());
		test.change(c);
		System.out.println(c.getWert());
	}
	
	public static void change(Container i){
		i.setWert(500);
	}
}

class Container{
	public int wert;

	public int getWert() {
		return wert;
	}

	public void setWert(int wert) {
		this.wert = wert;
	}	
}

ausser bei primitiven datentypen funktioniert es nicht und bei Strings, weil dort durch += neue Objekte erstellt werden.... oder so, aber das dürfen die profis näher begründen
 
M

maki

Gast
Vielleciht ist dem Themenstarter der Unterschied zwischen einem Objekt und einer Referenz nicht hinreichend klar?

C++ hat seine eigene Terminologie und "Kultur"..
 

fab!

Mitglied
hehe, diese Diskussion wollte ich eigentlich vermeiden... :lol:

nur übergibst du keine refernz sondern null
eben deswegen ist es "call by value"... (oder nicht???)

bei call by reference würde ich eine "echte" Referenz auf das Objet, also einen Zeiger wo mein Objet im Speicher liegt übergeben und somit wäre es kein Problem an dieser Stelle mit new neuen Speicher (auf dem Heap) zu allokieren und ein neues Objekt anzulegen...
da es aber eben call by value ist geht das nicht...

Aber meine eigentliche Frage war es , wie ich sowas in Java lösen kann...
Ein Vorschlag war es über den Rückgabewert einer Funktion zu lösen, gibt es noch andere?

Gruß
Fabian
 
M

maki

Gast
Da gibt es nichts zu diskutieren ;) Es ist eine Frage der Definition, in Java ist das so definiert:

In Java gibt es kein "call by reference"!!!
Alles wird per value übergeben.

Bitte beachten das man in Java Objekte immer über Referenzen anspricht, kopiert man die Referenz, so zeigt sie auf das selbe Objekt.

Auch sind Referenzen in Java eher mit Zeigern in C++ zu vergleichen.

Es ist wichtig das man die Sprache samt ihrer Terminologie und Kultur versteht, sonst git es missverständnisse.
 
G

Gast

Gast
Es ist wichtig das man die Sprache samt ihrer Terminologie und Kultur versteht, sonst git es missverständnisse.

Richtig! ABER die Definition des Begriffes Call by Reference bzw. Call by Value ist nicht Sprachabhaengig vielmehr handelt es sich um Definition mit denen Eigenschaften einer Sprache beschrieben werden.

Sprich es sollte ein Gang in die Bib helfen und dort ein Blick in ein Buch ueber die Struktur, Eigenschaften von Programmiersprachen.


Meine persoenliche Auffassung zum Thema:

Call by Value: Uebergabe von Werten

Call by Referenz: Ubergabe einer Referenz auf ein Object (Null ist kein Object!)

Folge:

Java benutzt sowohl Call by Reference genauer ObjectReferenz als auch Call by Value (atomare DT).

Wie schon erwaehnt meine Meinung und das was ich auf der UNI gelernt habe...

Fuer alle die eine andere Meinung vertretten. Bitte mit Angabe der Literaturquelle!




ps: Ich bin mir bewusst das ich keine Quelle angegeben habe das Ganze findet sich vermutlich in Bertrand Meyer Einführung in die OO (oder so ähnlich)
 

Wildcard

Top Contributor
Nur weil statt einer Objektkopie eine Kopie der Referenz übergeben wird, heißt das nicht, das es sich um call by reference handelt.
Wenn du das wirklich so auf der Uni gelernt hast, würde ich mir sorgen machen.
 
G

Gast von eben

Gast
Also hab mal ein wenig gegoogelt.

Erstes Ergebnis:

Java benutzt tatsächlich Call by Value. (da entwickelt man seit ueber 10 Jahren und dann sowas... :oops: )

siehe forum.java.sun.com/thread.jspa?threadID=591738&messageID=3087303

Aber noch gebe ich mich nicht geschlagen... Werde mal meine alten verstaubten Uni Sachen raussuchen und nachschauen was da drin steht. Kann allerdings etwas dauern...

Bis dahin :oops: :oops: :oops: :oops: :oops: :oops: ABER bis dahin muss ich mich wohl geschlagen geben... :autsch:

[/quote]
 

moormaster

Top Contributor
fab! hat gesagt.:
hehe, diese Diskussion wollte ich eigentlich vermeiden... :lol:
Aber meine eigentliche Frage war es , wie ich sowas in Java lösen kann...
Ein Vorschlag war es über den Rückgabewert einer Funktion zu lösen, gibt es noch andere?

Ja, mir fällt nur nichts ein, was einfacher zu handhaben wäre, als ein Rückgabewert :D

Alternativ käme mir in den Sinn, dass man ein zusätzliches Objekt übergibt, dessen Klasse ein Interface implementiert, wo dann eine Methode aufgerufen wird und die neue Referenz dort als Parameter übergeben wird.

Also sowas:

Code:
  public Interface MyCallback
  {
   public void newReference(Object c);
  }


  public class Other
  {
   public void createObject(Object c, MyCallback callb)
   {
    if (c == null)
     c = new Object();

    if (callb != null)
     callb.newReference(c);
   }

  //...
  ...
  {
   // Aufruf:

   MyCallback myc = new MyCallback()
   {
    public void newReference(Object c)
    {
     System.out.println("Objekt: " + c);
    }
   };

   createObject(null, myc);
  }
 }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Call-By-Reference umgehen Java Basics - Anfänger-Themen 4
J Java call by Value oder Reference Java Basics - Anfänger-Themen 35
R Call-by-Value, Call-by-Reference, Call-by-Name Ausgabe Java Basics - Anfänger-Themen 1
X Verständnisproblem Call-By-Reference Java Basics - Anfänger-Themen 5
U Worin besteht der Unterschied zwischen call by reference und call by value? Java Basics - Anfänger-Themen 14
H call by reference & value Java Basics - Anfänger-Themen 14
B Call by Value/Reference Java Basics - Anfänger-Themen 4
Joew0815 Methoden Objekt als Methoden-Parameter - Kein call-by-reference? Java Basics - Anfänger-Themen 12
T Array prozedur, call by reference ? Java Basics - Anfänger-Themen 6
B Variablen Wie macht man eine call by reference mit primitiven Datentypen in Java? Java Basics - Anfänger-Themen 2
S call by reference? Java Basics - Anfänger-Themen 52
F Verständisproblem bzgl. nicht Vorhandensein von Call-by-reference Java Basics - Anfänger-Themen 2
B Call By reference (Null pointer exception) Java Basics - Anfänger-Themen 6
C Call by reference Java Basics - Anfänger-Themen 11
W call-by-reference-Effekt bei Objekten Java Basics - Anfänger-Themen 3
S "Call by Reference" Java Basics - Anfänger-Themen 12
M try-catch, call-by-reference, Streaming und Strings Java Basics - Anfänger-Themen 10
S call by reference Java Basics - Anfänger-Themen 7
F Rekursive Aufrufe, Parameterübergabe, call by reference Java Basics - Anfänger-Themen 3
B Call by Reference Java Basics - Anfänger-Themen 7
S call by reference vs. call by value - pls help Java Basics - Anfänger-Themen 7
K Eigene Annotations, Pre-/Post-/Call-Method Java Basics - Anfänger-Themen 6
G Klassen Call by Value auch bei Objekten? Java Basics - Anfänger-Themen 2
R Call By Referene? Java Basics - Anfänger-Themen 10
N Methode erfüllt nicht den zweck (Call by value) Java Basics - Anfänger-Themen 17
0 Call by value Java Basics - Anfänger-Themen 3
J Call by ... Java Basics - Anfänger-Themen 16
F java call jython Java Basics - Anfänger-Themen 7
C Unchecked Call? Wie Warnung beseitigen? Java Basics - Anfänger-Themen 3
I call to super must be first statement in constructor Java Basics - Anfänger-Themen 3
M Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 10
T Boolean by Reference Java Basics - Anfänger-Themen 6
T Schleifenindex "by reference" / "by value" Java Basics - Anfänger-Themen 13
O Socket by reference übergeben Java Basics - Anfänger-Themen 0
A Cannot make a static reference to the non-static field Java Basics - Anfänger-Themen 6
O Illegal Group Reference Java Basics - Anfänger-Themen 4
L Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 6
K Variablen Cannot make a static reference to the non-static field time Java Basics - Anfänger-Themen 6
P Compiler-Fehler Cannot make a static reference to the non-static field process Java Basics - Anfänger-Themen 3
C Reference - wird gegen meinen Willen - auf null gesetzt Java Basics - Anfänger-Themen 2
F Mal wieder: Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 9
F Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 3
M Reference Java Basics - Anfänger-Themen 2
B Cannot make a static reference...?? Java Basics - Anfänger-Themen 5
B Mal wieder "cannot make a static reference..." Java Basics - Anfänger-Themen 2
N Reference to non-static method Java Basics - Anfänger-Themen 8
C Passing Reference by Value Java Basics - Anfänger-Themen 4
G Wieso ist eine String-Übergabe keine by-reference-Zuweisung? Java Basics - Anfänger-Themen 7
R Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 5
L [Gelöst] Cannot make a static reference ... Java Basics - Anfänger-Themen 12
N Connot make a static reference. deklarierungsfehler Java Basics - Anfänger-Themen 10
T object reference counts Java Basics - Anfänger-Themen 14
T Cannot make a static reference to the non-static field Java Basics - Anfänger-Themen 8
frau-u Altes Problem: non-static method cannot be reference Java Basics - Anfänger-Themen 7
F Wie kann ich diese NullPointerException umgehen?! Java Basics - Anfänger-Themen 41
Elaurin Erste Schritte effektiv lernen mit Java umgehen zu können? Java Basics - Anfänger-Themen 5
D NullPointerException umgehen Java Basics - Anfänger-Themen 17
D Mit mit geschweifter Klammer umgehen Java Basics - Anfänger-Themen 5
T Methoden Java Methode "umgehen" Java Basics - Anfänger-Themen 2
Meeresgott OOP Richtig mit java.util.Property umgehen Java Basics - Anfänger-Themen 22
U Vererbung Mehrfachvererbung - Wie umgehen? Java Basics - Anfänger-Themen 3
L Methoden Methoden umgehen Java Basics - Anfänger-Themen 5
D Compiler-Fehler Wie kann ich das Problem umgehen? Java Basics - Anfänger-Themen 2
P Gleichverteilung umgehen, Werte nacheinader zuweisen? Java Basics - Anfänger-Themen 1
B DTD. umgehen/ignorieren Java Basics - Anfänger-Themen 3
O Main-Methode static modifier umgehen Java Basics - Anfänger-Themen 10
C Vererbung "extends" umgehen mittels Objekterzeugung?! Java Basics - Anfänger-Themen 29
F wie mit einer ioexception umgehen Java Basics - Anfänger-Themen 10
-horn- Wie am Einfachsten mit Config-Datei umgehen. Welches Format? Java Basics - Anfänger-Themen 6
P Online Etests umgehen Java Basics - Anfänger-Themen 29
G Überschreiben einer Variable umgehen Java Basics - Anfänger-Themen 6
M oktale Interpretation der führenden Null umgehen Java Basics - Anfänger-Themen 5
S Mit Collection<int[]> umgehen Java Basics - Anfänger-Themen 2
F Wie muss ich mit Preferences umgehen. Java Basics - Anfänger-Themen 5
T Umgehen eines remote mySQL-Zugriffes? Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben