SwordMaster Geschrieben 20. Januar 2003 Geschrieben 20. Januar 2003 ich habe in meinem Programm ein Objekt in einer forschleife Deklariert... z.b. for (int i=0; i<10; i++) { Die wuerfel1 = new Die(); Die wuerfel2 = new Die(); zahl=wuerfel1.dice()+wuerfel2.dice(); //Zwei Würfel Addieren System.out.print(+zahl+" "); } mein Lehrer hat aber nun gesagt, dass die Objekte zwar bei jedem Durchlauf neu deklariert werden, jedoch dass sie nicht zerstört werden, sondern "Im Raum schweben"! Ich bin davon ausgegangen, dass sie jedesmal zerstört, und dann wieder neudeklariert werden... Werden Die Objekte (wuerfel1, und wuerfel2) nun am Ende eines Durchlaufs wieder zerstört oder nicht??? Ciao SwordMaster Zitieren
kingofbrain Geschrieben 20. Januar 2003 Geschrieben 20. Januar 2003 Guten morgen, Deine Objekte werden zunächst einmal nicht zerstört. Das heisst, der Speicher ist noch mit den Daten belegt. Allerdings merkt Java, dass es keine Referenz mehr auf die Objekte gibt. Und damit werden sie für den GarbageCollector freigegeben, der sie dann entsorgt. Stell es Dir wie einen Zeiger vor. Deine Variable zeigt nur auf einen Bereich im Speicher. Wenn Du der Variablen jetzt mit new eine neue Instanz verschaffst, ist das alte Objekt noch da, kann aber nicht mehr erreicht werden, da der Zeiger fehlt. Also hat Dein Lehrer recht, die Objekte leben noch. Allerdings weiss keiner, wie lange, weil der GC nach eigenem Ermessen (d.h. wie er programmiert ist) die Speicherbereinigung durchführt. Peter Zitieren
Jaraz Geschrieben 20. Januar 2003 Geschrieben 20. Januar 2003 Originally posted by SwordMaster mein Lehrer hat aber nun gesagt, dass die Objekte zwar bei jedem Durchlauf neu deklariert werden, jedoch dass sie nicht zerstört werden, sondern "Im Raum schweben"! Und wieder ein Lehrer der von C++ kommt. In Java werden alle Objekte durch den GC (Garbage Collector) gelöscht. Da sollte man auch nicht selbst drin rumpfuschen. (Ja ich weiss, man kann sie auch von Hand löschen.) Man sollte allerdings drauf achten, das man alle Referenzen löscht. z.B. angemeldete Listener werden sehr gerne vergessen. Bei deinem Beispiel schadet es allerdings nicht, die Variablen vor der Schleife zu deklarieren. Gruß Jaraz Zitieren
Der Kleine Geschrieben 20. Januar 2003 Geschrieben 20. Januar 2003 Mach nen Durchlauf bis zu 1.000.000 und kontrolliere Deinen Speicher. Wenn Du neu starten musst, ist es nicht so gut. Entweder werden die Objekte gar nicht oder erst zu spät zerstört. Ansonsten ist Java so angelegt, wie die beiden Vorredner bereits erläuterten. Zitieren
SwordMaster Geschrieben 20. Januar 2003 Autor Geschrieben 20. Januar 2003 Ihr Verräter....*übertrieben sag* des is doch mei Schulaufgabe.... und i bin auf Punktesammeln )..... Und habs dort leider in der For-Schleife Deklariert... nur des passt dem Lehrer leider ned naja muß ich eben weiter Punkte suchen Ciao SwordMaster Zitieren
Der Kleine Geschrieben 20. Januar 2003 Geschrieben 20. Januar 2003 Originally posted by Jaraz In Java werden alle Objekte durch den GC (Garbage Collector) gelöscht. Muß man leider gelten lassen. Also keine Verräter! Zitieren
SgtBadAzz Geschrieben 20. Januar 2003 Geschrieben 20. Januar 2003 Originally posted by SwordMaster ich habe in meinem Programm ein Objekt in einer forschleife Deklariert... z.b. for (int i=0; i<10; i++) { Die wuerfel1 = new Die(); Die wuerfel2 = new Die(); zahl=wuerfel1.dice()+wuerfel2.dice(); //Zwei Würfel Addieren System.out.print(+zahl+" "); } mein Lehrer hat aber nun gesagt, dass die Objekte zwar bei jedem Durchlauf neu deklariert werden, jedoch dass sie nicht zerstört werden, sondern "Im Raum schweben"! Ich bin davon ausgegangen, dass sie jedesmal zerstört, und dann wieder neudeklariert werden... Werden Die Objekte (wuerfel1, und wuerfel2) nun am Ende eines Durchlaufs wieder zerstört oder nicht??? Ciao SwordMaster Faktisch ist es so, sobald KEINE Referenz auf eine Instanz einer Klasse mehr exisitiert ist diese nicht mehr verwendbar. Frueher oder spaeter wird sie vom Garbage Collector entsorgt, ob das nun gleich oder etwas spaeter passiert kann man nicht sagen, ueblichweise macht der GC sowas in Chunks und sammelt erstmal ein paar Objekte deren Speicher er wieder freigeben soll. Ob die nun irgendwo noch sind diese Instanzen oder nicht ist fuer dich vollkommen uninteressant .... du kannst und darfst damit nichts mehr machen. Wenn du magst kannst du am Ende der Schleife die Variabeln wuerfel1 und wuerfel2 mit null initialisieren dann kann eventuell der GC schneller arbeiten. Und dein Lehrer verwirrt nur die Leute ... oder was soll denn die Aussage "Schweben noch in der Luft" bedeuten ? Frank Zitieren
SgtBadAzz Geschrieben 20. Januar 2003 Geschrieben 20. Januar 2003 Originally posted by Jaraz Und wieder ein Lehrer der von C++ kommt. In Java werden alle Objekte durch den GC (Garbage Collector) gelöscht. Da sollte man auch nicht selbst drin rumpfuschen. (Ja ich weiss, man kann sie auch von Hand löschen.) Man sollte allerdings drauf achten, das man alle Referenzen löscht. z.B. angemeldete Listener werden sehr gerne vergessen. Bei deinem Beispiel schadet es allerdings nicht, die Variablen vor der Schleife zu deklarieren. Gruß Jaraz Das man Objekte von Hand loeschen kann ... das habe ich noch nie gehoert ... ich kann Referenzen von Hand ueberschreiben aber die eigentliche Speicherfreigabe macht der GC wenn keine Referenz auf dieses Objekt exisitiert. Das Ueberschreiben einer Referenz mit null hilft dem GC aber letztendlich wird der Speicher fuer das Objekt immer noch vom GC freigegeben, wenn er Lust dazu hat. Frank Zitieren
Jaraz Geschrieben 20. Januar 2003 Geschrieben 20. Januar 2003 Originally posted by SgtBadAzz Das man Objekte von Hand loeschen kann ... das habe ich noch nie gehoert ... Ja, da habe ich mich falsch ausgedrückt. Ich meinte der GC läuft automatisch, man kann in aber von Hand mit System.gc() selbst starten. Da die VM aber alleine merkt, wann Speicher knapp wird und der Prozessor Zeit hat, würde ich nur im Notfall auf die Funktion zurückgreifen. Gruß Jaraz Zitieren
Naberius Geschrieben 20. Januar 2003 Geschrieben 20. Januar 2003 Also so wie du es implementiert hast würde es unter Java ohne Probleme laufen, aber es ist kein besonders schöner Programmierstyl vondaher hat dein Lehrer leider recht dir die Punkte abzuziehen. Sorry! Zitieren
SwordMaster Geschrieben 20. Januar 2003 Autor Geschrieben 20. Januar 2003 i glaubs euch ja eh :( aber ich werds mir merken Zitieren
SgtBadAzz Geschrieben 21. Januar 2003 Geschrieben 21. Januar 2003 Originally posted by Naberius Also so wie du es implementiert hast würde es unter Java ohne Probleme laufen, aber es ist kein besonders schöner Programmierstyl vondaher hat dein Lehrer leider recht dir die Punkte abzuziehen. Sorry! Warum ist das keine schoener Programmierstil , was ist denn daran so falsch oder nicht ok ? Frank Zitieren
Klotzkopp Geschrieben 21. Januar 2003 Geschrieben 21. Januar 2003 Wir haben hier 20 Objekte (und damit auch 20 Konstruktoraufrufe), wo eins reichen würde. Zitieren
SgtBadAzz Geschrieben 21. Januar 2003 Geschrieben 21. Januar 2003 Originally posted by Klotzkopp Wir haben hier 20 Objekte (und damit auch 20 Konstruktoraufrufe), wo eins reichen würde. Vielleicht erzeugt nur new Dice() ein Objekt mit einer neuen Zufallszahl. Zitieren
Klotzkopp Geschrieben 21. Januar 2003 Geschrieben 21. Januar 2003 Originally posted by SgtBadAzz Vielleicht erzeugt nur new Dice() ein Objekt mit einer neuen Zufallszahl. Natürlich kann ich ohne genaue Kenntniss der Klasse Die auch nur Vermutungen anstellen. Wenn es aber so wäre, wie du sagst, dann wäre kein weiterer Methodenaufruf nötig, um an den Wert zu kommen. Außerdem wäre die Klasse Die dann schlecht entworfen. Ich denke, man kann davon ausgehen, dass die Klasse Die den Würfel darstellen soll, und Die.dice() den Wurf. Und genau da sehe ich das Problem. Brauche ich für 20 Würfelwürfe 20 Würfel? Oder werfe ich besser denselben Würfel 20mal? Zitieren
SgtBadAzz Geschrieben 21. Januar 2003 Geschrieben 21. Januar 2003 Originally posted by Klotzkopp Natürlich kann ich ohne genaue Kenntniss der Klasse Die auch nur Vermutungen anstellen. Wenn es aber so wäre, wie du sagst, dann wäre kein weiterer Methodenaufruf nötig, um an den Wert zu kommen. Außerdem wäre die Klasse Die dann schlecht entworfen. Ich denke, man kann davon ausgehen, dass die Klasse Die den Würfel darstellen soll, und Die.dice() den Wurf. Und genau da sehe ich das Problem. Brauche ich für 20 Würfelwürfe 20 Würfel? Oder werfe ich besser denselben Würfel 20mal? Wenn es Wuerfel billig gibt ... nehme ich gerne mal mehr . Das einzige Problem waere eventuell die Laufzeit aber das ist wohl auch nicht so wichtig hier .... das + + mit den Strings duerfte mehr Zeit kosten. :marine Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.