Zum Inhalt springen

Deklaration in der Forschleife


SwordMaster

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Jaraz

Und wieder ein Lehrer der von C++ kommt. :D

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...