String str1;
String str2 = null;
String str3 = "";
String str4 = new String();
String str5 = new String("");
Ich weiß, dass die oben für 3. Initialisierung, die die String-Objekt in dem String Pool initialisiert und der 4. hat nichts mit dem String-Pool zu tun.String Initialisierung in Java
Was ist der Unterschied zwischen 1. und 2.? Wenn ich str1
als eine Zeigervariable betrachte, speichert es eine bestimmte Speicheradresse, die nie von der JVM oder dem OS verwendet wird?
Gibt es einen Unterschied zwischen 4. und 5.?
Wenn ich drucke str1
und str2
direkt von System.out.println(str1)
und System.out.println(str2)
, für str1
, ich nicht einmal die compilation.For str2
passieren kann, ist Kompilation OK und ich „null“ und die Ausgabe im Konsolenfenster zu bekommen. Warum?
nach der Antwort von @aioobe Editiert: mehr Fragen:
Ich mag würde mehr über „null“ wissen. Da str2
(Referenzvariable) wie eine Zeigervariable ist, sollte etwas (0/1 Bits) drin sein (im Speicher, der von dieser Zeigervariable belegt wird). Wie es als null initialisiert wird, ist es all-0-Bits oder der Bytecode von null ist alles-null? Eine andere Frage ist, dass, wenn ich die Methode ToString() auf str2
von str2.toString()
aufrufen, bekam ich einen NullPointer Fehler zur Laufzeit. Also überprüft JVM, ob die Referenzvariable null ist? Wie kann JVM wissen, dass es null ist? JVM prüft die Bits in str2
?
Noch eine Frage über null in Java: concatenation of null and a string literal
Aktualisiert meine Antwort mit einer Antwort auf Sie bearbeiten. – aioobe
Kann jemand, der gewählt hat, einen Grund geben? kann es nicht herausfinden ... –
Ich denke, die Leute glauben, dass dies schon einmal gefragt wurde. Ein Teil Ihrer Frage * wurde * schon einmal gestellt, ein Teil Ihrer Frage nicht. – aioobe