#1 29. November 2009 verständnisfragen wie die Titel schon sagt geht es hier um allgemeine Fragen die ich habe zum Thema java habe. Meist sind es allgemeine Fraggen ob ich einen Sachverhalt richtig verstehe. Ich werde meinen Text immer wieder editieren sofern neue Fragen auftreten. Beispiel 1 Angenommen ich habe die Klasse Mensch erstellt mit einigen attributen. nun möchte ich ein Objekt daraus schnitzen Code: new Mensch(); Mensch p; p = new Mensch(); ich habe ein Objekt der Klasse Mensch erstellt. Dann eine Variable vom Typ Mensch mit dem namen p erstellt. Dann eine referenz des neuen Objektes p mitgeteilt. Danke für eure Hilfe. Sollten meine Angaben die ich gemacht habe reicht ein richitig. oder ein + Multi-Zitat Zitieren
#2 29. November 2009 AW: verständnisfragen falsch... new Mensch(); erstellt ein neues objekt, welches direkt wieder vom garbage collector gekillt wird weils in keiner variable gespeichert wird. erst da wo du p = new Mensch() machst wird wieder ein neues objekt erstellt und in die variable p gespeichert. mfg + Multi-Zitat Zitieren
#3 29. November 2009 AW: verständnisfragen ich dachte in p wird nur ein verweis auf das objekt gespeichert + Multi-Zitat Zitieren
#4 29. November 2009 AW: verständnisfragen nein. Nur wenn du folgendes machst: Mensch p, c; p = new Mensch(); c = p; dann ist c eine Referenz auf die Instanz die auch p innehat. new Mensch(); erstellt praktisch wie schon gesagt nur eine Instanz auf die es keine Referenzen gibt. Referenzlose Instanzen von Objekten werden vom Garbagecollector eliminiert. + Multi-Zitat Zitieren
#5 29. November 2009 AW: verständnisfragen ja natürlich. Aber der Garbage Collector von Java erkennt, wann Speicher bereinigt werden kann. In manch andren Sprachen muss man das selbst erledigen. Also ich veranschauliche es mal Bildlich [][][][][][][][][][][][][][][][][] so das is der Arbeitsspeicher den du für dein Programm zu Verfügung hast. nun führen wir mal deinen code aus new Mensch() [Mensch][][][][][][][][][][][][][][][][] so das steht jetzt ein Objekt von Typ Mensch drinne drinn nun Mensch p [][][][][][][][p=null][][][][][][][][][] so jetzt wurde das Objekt wieder gelöscht, weil du es net mehr nutzt, dass hat der Garbage Collector erkannt. Es wurde eine Variable p erzeugt, die erstmal auf null zeigt p=new Mensch; [][][][][][][][p=Mensch][][][][][][][][][] nun wurde ein objekt vom typmensch erzeugt Da zeigt nun p drauf Das ist zwar net hundert prozentig so aber ungefähr... + Multi-Zitat Zitieren
#6 29. November 2009 AW: verständnisfragen Ist richtig. Es gibt 2 verschiedene Speicher: Den Heap und den Stack. in deinem Fall: New Mensch(); -> erstellt ein Objekt im Heap, welches frei rumschwirrt und vom GC gelöscht wird (wie mein Vorvorvorvorposter schon richtig sagte) Mensch p; -> erstellt eine Variable im Stack vom Typ Mensch. p = new Mensch(); -> erstellt ein Objekt von Typ Mensch im Heap und p referenziert aus dem Stack auf das neu erstellte Objekt im Heap. //edit: mein Vorvorposter sagt jetzt zwar was anderes, aber ich bin mir fast sicher dass das so ist wie ich gesagt habe^^ + Multi-Zitat Zitieren
#7 29. November 2009 AW: verständnisfragen Das ist auch richtig. Eine Variable speichert immer eine Referenz auf ein Objekt. Allerdings gibt es in Java die angesprochene GarbageCollection. Diese sorgt dafür, dass nicht mehr referenzierte Objekte gelöscht werden. new Mensch(); => Objekt wird erstellt, Programm enthält keine Referenz auf dieses Objekt => Objekt wird von der GarbageCollection gelöscht. Mensch p = new Mensch(); Erzeugt ein Objekt und legt die Referenz in p ab (das Objekt kann bentuzt werden) Rein von der Logik: das obere Objekt könnteste du im Programm ohnehin nicht ansprechen, weil du die Referenz nicht abgelegt hast. edit: wow, hier posten ja jetzt alle auf einmal + Multi-Zitat Zitieren
#8 29. November 2009 AW: verständnisfragen ne das is bei c++ zB so, aber bei java werden objekte nur mit new erstellt. aufm stack landen zB lokale variablen, die halt am ende der methode nicht mehr wichtig sind, aber trotzdem muss man die objekte normal initialisieren. bei c++ ist es so, dass man wenn man new benutzt, objekte auf dem heap erstellt und wenn nicht, die aufm stack landen. + Multi-Zitat Zitieren