2015-06-07 37 views
7
  1. String str1;
  2. String str2 = null;
  3. String str3 = "";
  4. String str4 = new String();
  5. 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

+0

Aktualisiert meine Antwort mit einer Antwort auf Sie bearbeiten. – aioobe

+0

Kann jemand, der gewählt hat, einen Grund geben? kann es nicht herausfinden ... –

+0

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

Antwort

15

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?

Wenn diese Felder in einer Klasse, gibt es keinen Unterschied, da der Standardwert für ein Feld eines Referenztyp (wie String) ist bereits null.

Wenn diese lokale Variablen (das heißt Variablen in einer Methode deklariert) str1 nicht zu irgendetwas initialisiert werden, während str2 wird null initialisiert werden. Der Unterschied besteht darin, dass eine lokale Variable nicht verwendet werden kann, bis es initialisiert wurde, so (wie Sie entdeckt zu haben scheinen), die Sie nicht str1 drucken können, aber Sie können str2 drucken.

Gibt es einen Unterschied zwischen 4. und 5.?

Nein, nicht semantisch. Sie werden jedoch leicht abweichenden Byte-Code bekommen.

Wenn ich str1 und str2 direkt von System.out.println (str1) und System.out.println (str2) drucke, kann ich für str1 die Kompilierung nicht einmal bestehen. Für str2 ist die Kompilierung OK und ich bekomme "null" und die Ausgabe im Konsolenfenster. Warum?

Dies scheint darauf hinzuweisen, dass dies lokale Variablen sind. Lokale Variablen müssen vor der Verwendung initialisiert werden.

Ich möchte 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 alle-0-Bits oder der Bytecode null ist alles Null?

Dies wurde bereits gefragt worden (und beantwortet):

Eine andere Frage ist, dass, wenn ich die Methode toString() auf str2 von str2.toString() nennen, Ich habe einen NullPointer Fehler zur Laufzeit bekommen. Also prüft JVM, ob die Referenzvariable null ist?

Ja.

Wie kann JVM wissen, dass es null ist? JVM prüft die Bits in str2?

Ja.

+0

Diese Frage ist schon zu groß (und die Antwort auch!). Würde es Ihnen etwas ausmachen, den letzten als eine neue Frage auszuschneiden? Ich verspreche, mein Bestes zu geben, um zu antworten ... (Veröffentlichen Sie hier in den Kommentaren einen Link dazu.) – aioobe

1

Jede Variable in Java, die ein Objekt darstellt, ist in Wirklichkeit kein Wert, sondern ein Zeiger auf (Adresse von) einer Stelle im Speicher, die diese Variable speichert. null ist ein spezieller Typ von Zeiger, der bedeutet, dass die Variable (Zeiger) initialisiert ist, aber auf nichts zeigt. Da zwei beliebige String-Variablen Zeiger sind, wenn Sie sie wie str1 == str2 vergleichen, überprüfen Sie die Variablenpunkte auf dieselbe Instanz. Um den Inhalt zu vergleichen, den die Zeiger auf Sie zeigen, müssen Sie equals verwenden: str1.equals(str2), aber in diesem Fall müssen wir sicher sein, dass str1 nicht null ist.