neues Objekt erstellen vs objekt erstellen in C++
-
Hey,
in Java erstellt man ja n Objekt so:
klassenname objektname; objektname = new klassenname(<konstruktorparameter>);
Nja und ich habe mich gefragt wieso "new", ich kenne diesen Befehl aus Cpp und dort würde man das objekt auf dem Heap initialisieren mit den dementsprechenden Konsequenzen. Jetzt frage ich mich, heißt das bei Java das selbe?
Wenn ja:
Kann man dann bei Java auch Objekte auf dem Stack erstellen?
Muss man die erstellten Objekte dann explizit löschen?
Wie sieht dann die lebendsdauer des mit "new" erstellten Objektes aus?
und dann noch die dümmste Frage^^: Wieso macht man das so?Ich habe einen Info LK belegt in dem wir Java lernen (ich habe mich vorher mit Cpp auseinander gesetzt) und mir ist dies im Unterricht gestern aufgefallen, habe allerdings bei meinen Recherchen nicht viel Herrausfinden können, da ich nur Cpp Bücher besitze und wir von der Schule aus kein Java-Buch haben.
Danke für die Hilfe
mfg S.
-
> Kann man dann bei Java auch Objekte auf dem Stack erstellen?
nein
> Wie sieht dann die lebendsdauer des mit "new" erstellten Objektes aus?
bis zum sankt nimmerleinstag
> und dann noch die dümmste Frage^^: Wieso macht man das so?
wie denn sonst
-
@anfängerpeter: Naja, "sankt nimmerleinstag" ist falsch. Sobald keine Referenz mehr auf den Speicher verweist löscht Java solche Objekte automatisch.
Stichwort: Garbage collection, ein Konzept, dass neuere OOP-Sprachen meistens mitbringen (bspw. Java oder C#). Hat alles seine Vor- und Nachteile, findet man aber genügend im Internet dazu.
MfG SideWinder
-
> und dann noch die dümmste Frage^^: Wieso macht man das so?
wie denn sonstSo wie in cpp z.b., wenn ein Erfinder einer Sprache das so macht und nicht anders, dann hat er sich sicherlich was dabei gedacht (wie z.b. bei dem "unsigned" befehl).
Wie sieht dann die lebendsdauer des mit "new" erstellten Objektes aus?
bis zum sankt nimmerleinstagalso ein Speicher-leak?
schonmal danke für die antwort
-
Nein, eben kein Speicherloch.
Ja, der hat sich gedacht in seiner Sprache dem Programmierer mehr Kontrolle zu geben. In C++ hat man sehr viele Freiheiten die in anderen Sprachen nicht vorhanden sind. Dafür ist es auch viel schwieriger guten Code zu schreiben und etwaige Programmierer bekommen wohl deshalb mehr Lohn.
In Java hast du nun kein Problem mit Speicherlöchern, tust dir auch schwerer richtig miesen Code zu schreiben hast dafür aber auch nicht ganz soviel Kontrolle wann genau deine Objekte freigegeben werden.
Edit: Jeder hat sich dabei etwas gedacht, es gibt nunmal nicht *die* Sprache die für jeden Einsatzzweck immer bestmöglich geeignet ist.
MfG SideWinder
-
Jud4s schrieb:
> und dann noch die dümmste Frage^^: Wieso macht man das so?
wie denn sonstSo wie in cpp z.b., wenn ein Erfinder einer Sprache das so macht und nicht anders, dann hat er sich sicherlich was dabei gedacht (wie z.b. bei dem "unsigned" befehl).
Kapier ich nicht, du hast doch schon selbst festgestellt, dass es in Java analog wie in C++ funktioniert? :xmas2:
-
also hatte ich recht mit der Idee das "new" das Objekt wirklich auf dem heap erstellt?
Gilt diese indirekt gesteuerte lebendsdauer für alle Variablen die man mit "new" erstellt, oder geht das nur mit Objekten?
-
Jud4s schrieb:
Gilt diese indirekt gesteuerte lebendsdauer für alle Variablen die man mit "new" erstellt, oder geht das nur mit Objekten?
Garbage Collection betrifft in Java afaik alle mit new erzeugten Objekte.
MfG SideWinder
-
Kapier ich nicht, du hast doch schon selbst festgestellt, dass es in Java analog wie in C++ funktioniert?
Weil das meiner meinung nach umständlich ist, ich will vll garkein Objekt haben das länger als die 5 Programmzeilen "lebt".
-
Garbage Collection betrifft in Java afaik alle mit new erzeugten Objekte.
Ich habe absichtlich den Begriff Variablen benutz. Wollte also wissen ob es auch "new strings" oder "new int" gibt.
-
Jud4s schrieb:
Kapier ich nicht, du hast doch schon selbst festgestellt, dass es in Java analog wie in C++ funktioniert?
Weil das meiner meinung nach dämlich ist, ich will vll garkein Objekt haben das länger als die 5 Programmzeilen "lebt".
Wenn du soviel Kontrolle über dein Programm wirklich benötigst (Performance-Gründe, Resourcen-Knappheit, etc.) und du davon ausgehst so gut programmieren zu können, dass du den performantesten Zeitpunkt zum Löschen des Objektes besser erahnen kannst (und zwar zur Compile-Zeit) als das die JavaVM zur Runtime (also während der Ausführung) tun kann dann wäre für dich wohl C++ angebrachter. Ansonsten => Ist doch vollkommen egal, wann der Speicher dahinter wieder tatsächlich freigegeben wird. Ist ja genügend davon da.
MfG SideWinder
-
nja. Wenn ich das Objekt später wieder benutzen will ist es doch hopps, oder wie genau soll ich das mit "referenzen" verstehen?
{ { { objekt erstellen } objekt benutzen //aber hier ist es doch weg weil es keine Referenz gibt oder? } }
-
MyClass myObj3; // nur eine referenz, zeigt auf null { MyClass myObj; // myObj ist eine Referenz die derzeit auf null zeigt myObj = new MyClass(); // hier wird mit new ein neues MyClass-Objekt angelegt, myObj ist eine Referenz darauf MyClass myObj2 = new MyClass(); // Direkt, myObj2 ist eine Referenz auf ein eues MyClass-Objekt, nun gibt es zwei Objekte und zwei Referenzen myObj3 = myObj; // myObj3 zeigt nun auch auf das erste MyClass-Objekt } // *
Bei * werden nun die Referenzen myObj und myObj2, weil der Sichtbarkeitsbereich aus ist, gelöscht. Auf das erste mit new erzeugte Objekt zeigt immer noch myObj3 -> wird nicht vom Garbage Collector (GC) geölscht.
Auf das Objekt, auf welches vorher myObj2 gezeigt hat, zeigt aber nun keine Referenz mehr, nie wieder wirst du es benutzen können, definitiv nicht. Der GC erkennt das und löscht es bei Gelegenheit (z.B. wenn du gerade auf eine Eingabe wartest), aber nicht unbedingt sofort.
MfG SideWinder
-
ok, danke... jetzt versteh ich
nun nurnoch die Frage, wie sieht das mit normalen Variablen aus?
-
Jud4s schrieb:
nun nurnoch die Frage, wie sieht das mit normalen Variablen aus?
Was meinst du mit "normalen" Variablen? In Java werden alle Klasseninstanzen über Referenzen angesprochen, direkt auf den Stack kommen nur wenige eingebaute Typen wie
int
,boolean
etc. Diese wiederum kannst du ähnlich wie in C++ verwenden.int i = 3; // kein new bei int i = 5;
Es gibt auch spezielle Literale für Referenztypen, wie für die Klasse
String
oder Arrays. Diese sollen aber nicht darüber hinwegtäuschen, dass das Objekt dynamisch auf dem Heap angelegt wird.String s = "hallo"; int[] a = {1,2,3};
Ansonsten: Drück dich genauer aus.
-
Er fragt sich ob auch int, double, etc. bzw. nahezu-Standard-Typen wie String via Garbage Collector gelöscht werden oder auf den Stack kommen. Bzw. wie es bei int i = new int; aussieht (gibt es soetwas in Java überhaupt?)
MfG SideWinder
-
Nein, primitive Typen können nicht mit
new
angelegt werden und kommen auf den Stack. Anders sieht es beiString
oder den WrapperklassenInteger
& Co. aus.