einfache Frage zu Objekterstellung mit 'new'
-
Hallo zusammen, hab eine einfache Frage:
Wo ist der Unterschied zwischen dem:
String str = "Beispiel";
und dem:
String str = new String("Beispiel");
(Was sollte man ggf. bevorzugen ?)
Schonmal danke .
-
Ich muss gleich noch eine kleine Frage stellen, sorry:
String können ja, nachdem sie erstellt wurden, nicht mehr verändert werden... . Warum ist das dann möglich?String str = new String("Blabla"); str = "Blupp....Blaaah :P ";
? Hier wird noch str verändert ?! Oder nicht ?
danke^^
-
1. Frage: "new String( "etwas" )" kopiert den Inhalt des Strings "etwas", um einen neuen String zu erstellen. Im Endeffekt hat man ein Objekt zuviel, und mehr Code geschrieben als notwendig...
Also "Strint str = "etwas";" ist immer zu bevorzugen.
(Ausnahme: man benötigt explizit ein anderes Objekt)2. Frage: "str" wird tatsächlich verändert, aber "str" ist kein String. str ist eine Referenz auf ein String-Objekt. Das String-Objekt selbst, kannst du nicht verändern.
Was man mit "nicht veränderbar" meint ist: du kannst das Objekt auf das "str" zeigt nicht ändern. Du kannst nicht irgendwelchen Code schreiben, der "str" nicht berührt, aber bei dem "System.out.println( str )" vor und nach der Ausführung ein anderes Ergebnis liefert.
(Ausnahme: mit Reflection kann man alles verändern )
-
Hm gut (!), glaube das hab ich gecheckt .
Nur nochmal zur Kontrolle, könnte man das mit folgendem C++ vergleichen (bezüglich meiner 2. Frage) ? :
std::string* pRef; std::string strFirst = "Blabla"; std::string strSec = "Blupp....Blaaah :P "; pRef = &strFirst; // äquivalent zu: String str = new String("Blabla"); (also eigentlich nur der Zuweisung, nicht dem Anfordern durch new) std::cout << *pRef << std::endl; // gibt den Inhalt von strFirst aus, also "Blabla"; oder in Java: System.out.println(str); pRef = &strSec; // äquivalent zu: str = "Blupp....Blaaah :P "; (also str referenziert nun den String "Blupp...Blaaah :P") std::cout << *pRef << std::endl; // gibt den Inhalt von strSec aus, also "Blupp....Blaaah :P "
Ist das so korrekt ? Wie man sieht, ein C++-Entwickler, der in die Java-Welt einsteigt ...
-
Ja, das passt.
Einfache Regel: "Java-Referenz == C++ -Pointer ohne Pointerarithmetik".
-
Sehr gut, vielen Dank, auch für den Tipp.
Eine kleine Frage hat sich noch ergeben:
Was ist ein Paket ? Es gibt ja das Schlüsselwort package, aber was bewirkt es ?
Lies: Was versteht man allgemein in Java unter Paketen ?
-
Das ist sowas wie ein verkrüppelter/vereinfachter Namespace.
Eine Klasse/Inteface/... sieht alles was im selben Package ist, wie sie selbst. Alles andere ist unsichtbar, solange es nicht importiert (Schlüsselwort "import") ist.
Die Package-Struktur muss mit der Ordnerstruktur des Programmes übereinstimmen.Also eine Klasse Z im Package x.y hat den vollen Namen "x.y.Z", und muss in der Datei "x/y/Z.java" gespeichert sein.
Besonderheiten: Klassen die im selben Package liegen haben gegenseitig ein bisschen höhere Zugriffsrechte (es gibt "package interne" Methoden, Variablen, ...). Das Package "java.lang" ist immer sichtbar. Wenn man garnichts angibt, befindet man sich im Default-Package. Das Default-Package kann nicht importiert werden, weil "import ;" kein gültiger Syntax ist.
-
JBeni schrieb:
Das ist sowas wie ein verkrüppelter/vereinfachter Namespace.
Ich würde erweitert nicht vereinfacht sagen, da man ja mehr zugriffsrechte usw. hat.
-
Okay, vielen Dank für Eure Antworten - alles verstanden .