Referenzen - 2ter Versuch

kit fisto

Mitglied
Okay, ich mache einfach nen neuen Thread auf in dem ich das eigentliche Problem nochmal deutlicher mache:
Java:
List liste1 = new List();
String out1 = "";
String out2 = "";
for(int i=0;i<5;i++)
{
  liste1.insertBehind(""+i);
}

List liste2 = liste1;

liste1.toFirst();
liste2.toFirst();

while(!liste2.isBehind())
{
  out2 = out2 + (String)liste2.getItem();
  liste2.next();
}
while(!liste1.isBehind())
{
  out1 = out1 + (String)liste1.getItem();
}
System.out.println("neue Liste: "+out1);
System.out.println("alte Liste: "+out2);
Wer die Klasse list hat so wie sie für's Abitur vorgegeben wird, kanns ja mal testen. Was man sehen wird ist, dass die Ausgabe der "Neuen Liste" vollständig gelingt. Die Ausgabe der "alten Liste" ist jedoch leer. Dies liegt daran das list1 und list2 auf dasselbe Objekt verweisen - klare Sache.

Bei folgendem Programm hab ich vermutet das es sich genauso verhält:
Java:
public void fuegeHinzu(Ahne pAhne, String pLinie) {
  BinTree lBaum = hatAhnenbaum;
  while (pLinie.length() > 1) {
    if (pLinie.charAt(0) == 'm') {
      lBaum = lBaum.getLeftTree();
   }
   else {
     if (pLinie.charAt(0) == 'v') {
       lBaum = lBaum.getRightTree();
     }
   } // if else
   pLinie = pLinie.substring(1);
  } // while
  BinTree lNeuBlatt = new BinTree(pAhne);
  if ((pLinie.charAt(0) == 'm') {
    lBaum.setLeftTree(lNeuBlatt);
  }
  else {
    if ((pLinie.charAt(0) == 'v') {
      lBaum.setRightTree(lNeuBlatt);
    }
  } // if else
}
Hier sollten "hatAhnenBaum" und "lBaum" auf das gleiche Objekt verweisen oder? Ist aber scheinbar nicht so, denn wenn man sich mal "lBaum" und "hatAhnenBaum" ausgeben lässt, sieht man das "lBaum" nur aus einer Wurzel und einem Nachfolger (Blatt) besteht während "hatAhnenBaum" ein ganzer Ahnenbaum inklusive des neu hinzugefügten Element...

Warum ist dies so???? Sind nicht "hatAhnenBaum" und "lBaum" einfach Referenzen auf ein und dasselbe Objekt der Klasse BinTree ebenso wie "liste1" und "liste2" Referenzen auf ein und dasselber Objekt der Klasse List sind!?

Wo ist mein Denkfehler bzw die Erklärung für den Unterschied!?

Lg, kit fisto!
 
S

SlaterB

Gast
> denn wenn man sich mal "lBaum" und "hatAhnenBaum" ausgeben lässt
wann und wo machst du das?

lBaum ist anfangs gleich hatAhnenbaum, aber in Zeile 5 und 9 werden doch wieder ganz andere Bäume zugewiesen,
am Ende ist lBaum nicht ein Minibaum, dafür sogar ja gerade die große while-Schleife
 
Zuletzt bearbeitet von einem Moderator:

eRaaaa

Top Contributor
Hier sollten "hatAhnenBaum" und "lBaum" auf das gleiche Objekt verweisen oder?
Zumindestens nach Zeile2 denke ich schon ja
Ist aber scheinbar nicht so, denn wenn man sich mal "lBaum" und "hatAhnenBaum" ausgeben lässt, sieht man das "lBaum" nur aus einer Wurzel und einem Nachfolger (Blatt) besteht während "hatAhnenBaum" ein ganzer Ahnenbaum inklusive des neu hinzugefügten Element...

Naja, ich blicke zwar noch nicht ganz durch, aber du veränderst doch unter Umständen die Referenz von lBaum (Zeile5 und 9) ?? Dann zeigt lBaum ja nicht mehr aufs selbe Objekt....
 

kit fisto

Mitglied
Die Ausgabe erfolgt in dem Ausschnitt niergends ;) Das ist einfach eine Behauptung meinerseits die ich aber gegebenenfalls durch den Programmcode der Ausgabe noch bestätigen kann wenn ich wollt^^

eRaaaa du hast genau erkannt wo mein Problem ist glaube ich! lBaum wird verändert und ist am Ende ein ganz kleiner Baum an den in Zeile 16 & 20 ein neuer Teilbaum angehängt wird!

Wie kommt es nun dazu, dass wenn man hatAhnenBaum ausgibt, dieser neue Teilbaum, der an lBaum angefügt wurde, auch hier genau an der Stelle von lBaum auftaucht!?
 
S

SlaterB

Gast
wieso nicht?
wenn in eine Liste 5 Elemente drin sind und das Element 3 davon verändert wird und die Liste danach ausgegeben, dann zeigt sie auch das geänderte Element 3 an,

hier ist es ein Baum, der in einem unteren Teil verändert wird,
andere Variablen können ruhig auch auf den Baum oder einen der Unterknoten zeigen und darin was ändern,
da wird nicht automatisch ein neuer Baum erzeugt,

ein Teilbaum ist auch immer ein Baum, lBaum enthält keinen eigenen neuen Baum sondern einen Unterknoten des Hauptbaumes
 

kit fisto

Mitglied
hört sich ja so ziemlich banal an^^
Dieses Listenbeispiel wurde in der als sinnlos bewertet weil niemand eine solche konstruktion gebrauchen würde... Zwei Referenzen auf ein Objekt wären sinnlos^^ Aber beim Baum scheints ja notwendig zu sein?

[edit]
Naja das verändern bzw hinzufügen von Elementen in einen Baum ist ja ein wenig komplizierter als bei der Liste. und um die gewünschte stelle im baum zu finden muss man die die jeweiligen teilbäume ausgeben lassen... ist die stelle gefunden, wird an diesen teilbaum, der ja in meinem Beispiel lBaum ist, eingefügt. zu dem Zeitpunkt ist lBaum aber schon nicht mehr der große baum, sondern ein kleiner teilbaum... wo ist jetzt die beziehung vom kleinen zum großen teilbaum....

Und das funzt ja zB bei integern nicht:
a=1
b=a
b++; dann ist b=2 und a=1^^
 
Zuletzt bearbeitet:
S

SlaterB

Gast
zwei Referenzen sind beim Baum nicht sinnvoller als bei der Liste,
nur sieht es dort so aus als wären es zwei, zum Durchhangeln für die while-Schleife,

und die Referenz lBaum hat den gleichen Typ wie der Ursprungsbaum, das ergibt sich durch die Datenstruktur, hat aber für sich keine höhere Bedeutung,

die Liste ist an sich ein sehr gutes Vergleichsbeispiel
Java:
List l = ..            <->        Baum b = ..
Object o = l.get(i)    <->        Baum c = b; c = c.getLeft();
o.change();            <->        c.change();

->
l enthält verändertes o <->      Baum b enthält veränderte Unterelemente

--------

Und das funzt ja zB bei integern nicht:
a=1
b=a
b++; dann ist b=2 und a=1^^
immer das Zuweisen vom Verändern unterscheiden,
würde man der lBaum Variablen (oder in meinem Vergleichsbeispiel oben o und c) ein neues Objekt zuweisen, so würde das den Baum bzw. die Liste auch nicht kratzen,

x = ..;
ist immer was anderes als
x.changeIntern();
 
Zuletzt bearbeitet von einem Moderator:

function

Bekanntes Mitglied
wegen deinem baum, wenn ich das so richtig sehe setzt am Anfang lBaum und ahnenbaum gleich nur um einen "Startpunkt" zu geben. Im weiteren Programm verlauf wird lBaum immer durch einen Teilbaum, von sich selbst, ersetzt...
Wenn du schließlich an ein Blatt hinzufügst, fügst du einem Objekt Blatt(typ BinTree) einen weiteren BinTree hinzu, dadurch veränderst du das Objekt(intern) an der Stellen, das sowohl im ahnenbaum, also auch im lBaum die gleiche referenz besitzt, darum werden änderungen überall übernommen...

hoffe es wird klar was ich meinen ;)
 

kit fisto

Mitglied
und wieso ist das jetzt so.... Ich sehe immernoch nicht warum das beim baum so ist... tut mir leid oO
was meinst du mit "das ergibt sich durch die Datenstruktur"??
 
Zuletzt bearbeitet:

kit fisto

Mitglied
okay das hab ich glaub ich verstanden...
Ich möchte euch kurz erklären das ich in ca 3 oder 4 Wochen Abitur mache und meine LK-Lehrerin nicht im Stande ist mir eine solche Erklärung zu liefern. Und das mit der Liste war ihr vollkommen unbekannt... Danke euch!!!
 
S

SlaterB

Gast
> und wieso ist das jetzt so....
was genau?

'das ergibt sich durch die Datenstruktur' hatte ich zu 'die Referenz lBaum hat den gleichen Typ wie der Ursprungsbaum' geschrieben,
meinst du wirklich das?

so ist das eben bei rekursiven Datenstrukturen wie einen Baum,
dort kann man nicht sagen oben Baum, darunter Unterbaum, denn was kommt unter dem Unterbaum, ein Unterunterbaum?
jeder Teilbaum ist für sich selber ein vollständiger Baum, kann aber Teil eines anderen Baums sein,

warum? gut, das wird philosophisch, aber ohne diese Eigenschaft hätte man keine saubere beliebig erweiterbare Datenstruktur
 

kit fisto

Mitglied
Also ich merke schon Baum sollte man nur rekursiv bearbeiten^^ Das ist logischer
als dieser iterative Ansatz ;) Also nochmal als zusammenfassung:
lBaum und hatAhnenBaum sind zunächst das gleiche. lBaum wird aber dann immer wieder zu seinen eigenen Teilbäumen die auch an gleicher Stelle in hatAhnenbaum vorhanden sind. Wird ein Element (lBaum) geändert, so wird es auch in hatAhnenBaum geändert, weil lBaum immernoch ein Element aus hatAhnenBaum ist!? Soweit richtig???
 
S

SlaterB

Gast
wenn du es so genau nimmst:

> die auch an gleicher Stelle in hatAhnenbaum vorhanden sind
-> welche gleiche Stelle? lBaum ist für sich ein Baum, da gibts keine Stelle, lBaum hat aber im Ahnenbaum eine gewisse Stelle,
so wie ein Objekt o in einer Liste eine gewisse Position hat, Index 4 oder 7, aber man würde nicht von 'gleicher Position' sprechen

> weil lBaum immernoch ein Element aus hatAhnenBaum ist
fand ich zunächst noch mehr 'in etwaiger', aber ist wohl doch eine korrekte Bezeichnung
 

Michael...

Top Contributor
Variablen sind keine Objekte sondern referenzieren auf diese.
Zu Beginn zeigen sowohl lBaum als auch hatAhnenBaum auf das selbe Objekt.
In der while Schleife "wandert" lBaum - anhand der in pLinie definierten Regeln - durch die Baumstruktur und zeigt am Ende auf einen Knoten innerhalb der Baumstruktur
Dann wird an den Knoten auf den lBaum zeigt etwas verändert. Dieser Knoten ist aber immer noch Bestandteil der selben Baumstruktur zu dem auch der (hierarchisch höher angesiedelte) Knoten gehört auf den hatAhnenBaum referenziert.
 

function

Bekanntes Mitglied
> weil lBaum immernoch ein Element aus hatAhnenBaum ist
fand ich zunächst noch mehr 'in etwaiger', aber ist wohl doch eine korrekte Bezeichnung
Da sehe ich auch die Schwierigkeit in der Beschreibung, weil der AhnenBaum selbst nicht weiß wie tief/groß er ist. Er weiß, dass er ein Knoten mit 0, 1, oder 2 "Blättern" ist. Tiefergehende Strukturen kennt der AhnenBaum nicht, seine "Blätter" können echte Blätter sein, aber auch weitere Bäume...
Ich will dich nicht groß verwirren,deshalb
Deine Aussage, dass ein Element eines "Unterbaums"(lBaum) immer ein Element des AhnenBaums ist, ist eine Zwangsbeziehung der Konstruktion...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Hab ich dass so richtig erklärt (Objekte und Referenzen)? Java Basics - Anfänger-Themen 5
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
M Referenzen zuweisen und wird gleichzeitig ausgeführt Java Basics - Anfänger-Themen 6
B JaxB - Unique Name updaten / Referenzen in XML Java Basics - Anfänger-Themen 0
B Objekt kopieren und sämtliche Referenzen von diesem Objekt? Java Basics - Anfänger-Themen 3
B JaxB - Referenzen erstellen? Java Basics - Anfänger-Themen 2
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
B Datenbank: Entity mit vielen Referenzen? Ansatz so ok? Java Basics - Anfänger-Themen 8
scratchy1 Referenzen Java Basics - Anfänger-Themen 32
O Referenzen Java Basics - Anfänger-Themen 2
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
A Variablen Referenzen Java Basics - Anfänger-Themen 6
A GUI-Bedienelemente mit Zeiger/Referenzen-Array veralten Java Basics - Anfänger-Themen 4
K Operatoren 2D Int Array auf Null-Referenzen prüfen Java Basics - Anfänger-Themen 18
F Referenzen zwischen Methoden Java Basics - Anfänger-Themen 5
T Klassen Referenzen auf Klassen / Objekte Java Basics - Anfänger-Themen 5
J OOP Ein Fahrrad - zwei Besitzer: Zwei Referenzen auf ein Objekt Java Basics - Anfänger-Themen 43
C Referenzen zu Instanzen einer Klasse im Array Java Basics - Anfänger-Themen 8
K Collections Auf Referenzen in ArrayList zugreifen? Java Basics - Anfänger-Themen 3
B ArrayList.clear - Daten in allen Referenzen weg Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
C OOP Referenzen-Problem Java Basics - Anfänger-Themen 3
N Referenzen Problem Java Basics - Anfänger-Themen 2
M Instanzen, Referenzen und Collections Java Basics - Anfänger-Themen 3
C Referenzen in Java Java Basics - Anfänger-Themen 11
J Referenzen vergleichen Java Basics - Anfänger-Themen 8
M Referenzen verschieben Java Basics - Anfänger-Themen 2
J Mehrere Referenzen auf ein Objekt Java Basics - Anfänger-Themen 6
M Referenzen Java Basics - Anfänger-Themen 11
G Netzwerk: RMI Objekt-Referenzen Java Basics - Anfänger-Themen 2
I clone() und Referenzen Java Basics - Anfänger-Themen 25
A Referenzen zu festen Werten machen? Java Basics - Anfänger-Themen 5
F Referenzen Java Basics - Anfänger-Themen 7
H Problem mit Events bzw. Referenzen Java Basics - Anfänger-Themen 4
M Zugriff auf Textfelder über Referenzen? Java Basics - Anfänger-Themen 3
F ArrayList! Pointer, Referenzen! Java Basics - Anfänger-Themen 4
K Verständnisfrage Collection, ArrayList und Referenzen Java Basics - Anfänger-Themen 4
H Begriff: Objekt enthält Referenzen Java Basics - Anfänger-Themen 3
J Referenzen Java Basics - Anfänger-Themen 5
P HashSet und Referenzen Java Basics - Anfänger-Themen 9
G Speicherung von Referenzen auf Instanzen Java Basics - Anfänger-Themen 5
T Referenzen. Java Basics - Anfänger-Themen 5
Z Referenzen in LinkedList Java Basics - Anfänger-Themen 3
F Referenzen in Java - Fehlerpotenzial ! Java Basics - Anfänger-Themen 5
G Instanzen und Referenzen Java Basics - Anfänger-Themen 5
G array auf null-referenzen überprüfen ! Java Basics - Anfänger-Themen 9
G Referenzen Java Basics - Anfänger-Themen 5
T Fehlermeldung beim Versuch, einen String einzulesen Java Basics - Anfänger-Themen 4
O JavaFX XML Versuch Java Basics - Anfänger-Themen 2
P Erste Schritte Versuch Digital Uhr zu erstellen Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
K Erster Versuch ein Hello World Projekt zu schreiben Java Basics - Anfänger-Themen 11
C Java-Applet Versuch Java Basics - Anfänger-Themen 12
JFeel-x 4 gewinnt-Versuch + Probleme Java Basics - Anfänger-Themen 2
S Erster Versuch: Passwort erstellen Java Basics - Anfänger-Themen 3
ChackZz Java-Rätsel: Mein erster Versuch Java Basics - Anfänger-Themen 19
H Streams etc. erster Versuch Zeilen aus einer Datei zu lesen Java Basics - Anfänger-Themen 6
O Look and Feel - mein 1. Versuch Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben