Was ist null
?
Ist null
eine Instanz von irgendetwas?
Zu welchem Set null
gehört das?
Wie ist es in der Erinnerung dargestellt?
java
null
terminology
unj2
quelle
quelle
Antworten:
Nein, es gibt keinen Typ, der ein
null
istinstanceof
.15.20.2 Typvergleichsoperator
instanceof
Dies bedeutet, dass für jeden Typ
E
undR
für jedenE o
, woo == null
,o instanceof R
immer istfalse
.JLS 4.1 Die Arten von Typen und Werten
Wie das obige JLS-Zitat sagt, können Sie in der Praxis einfach so tun, als wäre es "nur ein spezielles Literal, das von jedem Referenztyp sein kann".
In Java
null == null
(dies ist in anderen Sprachen nicht immer der Fall). Beachten Sie auch, dass es vertraglich auch diese besondere Eigenschaft (vonjava.lang.Object
) hat:Dies ist auch der Standardwert (für Variablen mit diesen) für alle Referenztypen:
JLS 4.12.5 Anfangswerte von Variablen
Wie dies verwendet wird, ist unterschiedlich. Sie können es verwenden, um die sogenannte verzögerte Initialisierung von Feldern zu aktivieren , bei der ein Feld seinen Anfangswert haben würde,
null
bis es tatsächlich verwendet wird, wobei es durch den "echten" Wert ersetzt wird (dessen Berechnung teuer sein kann).Es gibt auch andere Verwendungszwecke. Nehmen wir ein reales Beispiel aus
java.lang.System
:Dies ist ein sehr häufiges Verwendungsmuster:
null
Wird verwendet, um die Nichtexistenz eines Objekts anzuzeigen.Hier ist ein weiteres Anwendungsbeispiel, diesmal von
java.io.BufferedReader
:Also hier
readLine()
würdeinstanceof String
für jede Zeile zurückkehren, bis es schließlich ein zurückgibtnull
, um das Ende zu kennzeichnen. Auf diese Weise können Sie jede Zeile wie folgt verarbeiten:Man kann die API so entwerfen, dass die Beendigungsbedingung nicht von der
readLine()
Rückgabe abhängtnull
, aber man kann sehen, dass dieses Design den Vorteil hat, die Dinge kurz zu machen. Beachten Sie, dass es kein Problem mit leeren Zeilen gibt, da es sich um eine leere Zeile handelt"" != null
.Nehmen wir ein weiteres Beispiel, diesmal von
java.util.Map<K,V>
:Hier beginnen wir zu sehen, wie die Verwendung
null
die Dinge komplizieren kann. Die erste Anweisung besagt, dass, wenn der Schlüssel nicht zugeordnetnull
ist, zurückgegeben wird. Die zweite Anweisung besagt, dass der Schlüssel auch dann zurückgegeben werdennull
kann , wenn er zugeordnet ist .Im Gegensatz dazu wird
java.util.Hashtable
die Sache einfacher, indemnull
Schlüssel und Werte nicht zugelassen werden. seinV get(Object key)
, wenn zurückkehrtnull
, bedeutet eindeutig , dass der Schlüssel nicht abgebildet wird.Sie können den Rest der APIs durchlesen und herausfinden, wo und wie sie
null
verwendet werden. Denken Sie daran, dass dies nicht immer die Best-Practice- Beispiele sind.Im Allgemeinen
null
werden sie als besonderer Wert verwendet, um Folgendes zu kennzeichnen:In Java? Geht dich nichts an. Und das ist am besten so.
Ist
null
eine gute Sache?Dies ist jetzt grenzwertig subjektiv. Einige Leute sagen,
null
dass dies viele Programmiererfehler verursacht, die hätten vermieden werden können. Einige sagen, dass es in einer Sprache, dieNullPointerException
wie Java funktioniert, gut ist, sie zu verwenden, da Sie bei Programmiererfehlern schnell ausfallen werden. Einige Leute vermeiden dies,null
indem sie Null-Objektmuster usw. verwenden.Dies ist ein großes Thema für sich, daher wird es am besten als Antwort auf eine andere Frage diskutiert.
Ich werde dies mit einem Zitat des Erfinders von sich
null
selbst, CAR Hoare (von schnellem Ruhm), beenden :Das Video dieser Präsentation geht tiefer; Es ist eine empfohlene Uhr.
quelle
NIL
) gab es 1960 und wahrscheinlich früher keine Referenzen . Aber ich glaube nicht, dass Hoare wirklich versucht, die Erfindung von Nullreferenzen in diesem Zitat zu beanspruchen.Deshalb
null instanceof X
wirdfalse
für alle Klassen zurückkehrenX
. (Lassen Sie sich nicht von der Tatsache täuschen, dass Sienull
einer Variablen zuweisen können, deren Typ ein Objekttyp ist. Genau genommen beinhaltet die Zuweisung eine implizite Typkonvertierung; siehe unten.)Es ist das einzige Mitglied des Nulltyps, wobei der Nulltyp wie folgt definiert ist:
"Es gibt auch einen speziellen Null-Typ, den Typ des Ausdrucks null, der keinen Namen hat. Da der Null-Typ keinen Namen hat, ist es unmöglich, eine Variable vom Null-Typ zu deklarieren oder in den Null-Typ umzuwandeln. Die Null Referenz ist der einzig mögliche Wert eines Ausdrucks vom Typ Null. Die Nullreferenz kann immer in einen beliebigen Referenztyp umgewandelt werden. In der Praxis kann der Programmierer den Nulltyp ignorieren und einfach so tun, als wäre Null lediglich ein spezielles Literal, das von einem beliebigen Typ sein kann Referenztyp." JLS 4.1
Siehe oben. In einigen Kontexten
null
wird "kein Objekt" oder "unbekannt" oder "nicht verfügbar" bezeichnet, aber diese Bedeutungen sind anwendungsspezifisch.Das ist implementierungsspezifisch, und Sie können die Darstellung
null
in einem reinen Java-Programm nicht sehen. (null
Wird jedoch in den meisten, wenn nicht allen Java-Implementierungen als Null-Maschinenadresse / -zeiger dargestellt.)quelle
Was ist null?
Es ist nichts.
Ist null eine Instanz von irgendetwas?
Nein, da es nichts ist. Es kann keine Instanz von irgendetwas sein.
Zu welcher Menge gehört null?
Kein Satz
Wie ist es in der Erinnerung dargestellt?
Wenn einige Verweise darauf wie folgt lauten:
Im Heapspeicher wird dem neu erstellten Objekt etwas Speicherplatz zugewiesen. Und o zeigt auf den zugewiesenen Speicherplatz.
Jetzt
o=null;
Dies bedeutet, dass o jetzt nicht auf diesen Speicherbereich des Objekts zeigt.
quelle
Nein, es ist nicht die Instanz von irgendetwas, die Instanz von wird immer falsch sein.
quelle
Das Schlüsselwort null ist ein Literal, das eine Nullreferenz darstellt , die auf kein Objekt verweist . null ist der Standardwert von Variablen vom Referenztyp.
Vielleicht auch mal reinschauen
null: Java-Glossar
quelle
Null ist keine Instanz einer Klasse.
Sie können jedoch Variablen eines beliebigen (Objekt- oder Array-) Typs null zuweisen:
quelle
Null in Java (tm)
In C und C ++ ist "NULL" eine in einer Header-Datei definierte Konstante mit einem Wert wie:
oder:
oder:
abhängig von den Optionen des Compilers und des Speichermodells. NULL ist streng genommen nicht Teil von C / C ++.
In Java (tm) ist "null" kein Schlüsselwort, sondern ein spezielles Literal vom Typ null. Es kann in einen beliebigen Referenztyp umgewandelt werden, jedoch nicht in einen primitiven Typ wie int oder boolean. Das Null-Literal muss nicht unbedingt den Wert Null haben. Und es ist unmöglich, in den Null-Typ umzuwandeln oder eine Variable dieses Typs zu deklarieren.
quelle
Bytecode-Darstellung
Java
null
hat direkte JVM-Unterstützung: Drei Anweisungen werden verwendet, um es zu implementieren:aconst_null
: zB um eine Variable aufnull
wie in zu setzenObject o = null;
ifnull
undifnonnull
: zB um ein Objekt mitnull
wie in zu vergleichenif (o == null)
In Kapitel 6 "Der Befehlssatz für Java Virtual Machine" werden dann die Auswirkungen
null
auf andere Anweisungen erwähnt:NullPointerException
Für viele von ihnen wird ein a ausgelöst.2.4. "Referenztypen und Werte" erwähnt auch
null
allgemein:quelle
null
ist ein besonderer Wert, es ist keine Instanz von irgendetwas. Aus offensichtlichem Grund kann esinstanceof
nichts sein.quelle
null
ist ein spezieller Wert, der keine Instanz einer Klasse ist. Dies wird durch das folgende Programm veranschaulicht:quelle
null
es sich nicht um eine Instanz von handeltString
.void f(String o)
, ist dies sinnvoller.null in Java ist wie / ähnlich wie nullptr in C ++.
Programm in C ++:
Gleiches Programm in Java:
Verstehen Sie nun anhand der obigen Codes, was in Java null ist? Wenn nein, dann empfehle ich Ihnen, Zeiger in C / C ++ zu lernen, und dann werden Sie verstehen.
Beachten Sie, dass in C im Gegensatz zu C ++ nullptr undefiniert ist, aber stattdessen NULL verwendet wird, was auch in C ++ verwendet werden kann. In C ++ ist nullptr jedoch vorzuziehen als nur NULL, da NULL in C immer mit Zeigern zusammenhängt und das ist In C ++ wurde das Suffix "ptr" an das Ende des Wortes angehängt, und auch alle Buchstaben sind jetzt in Kleinbuchstaben geschrieben, dies ist jedoch weniger wichtig.
In Java verweist jede Variable der nicht primitiven Typklasse immer auf ein Objekt dieses Typs oder wird geerbt, und null ist eine Objektreferenz der Nullklasse, jedoch kein Nullzeiger, da es in Java keinen solchen "Zeiger" gibt, sondern Verweise auf die Klasse Stattdessen werden Objekte verwendet, und null in Java bezieht sich auf Klassenobjektreferenzen. Sie können es also auch als "nullref" oder "nullrefobj" bezeichnen. Dies ist jedoch lang. Nennen Sie es einfach "null".
In C ++ können Sie Zeiger und den Wert nullptr für optionale Mitglieder / Variablen verwenden, dh Mitglied / Variable, die keinen Wert hat. Wenn sie keinen Wert hat, entspricht sie nullptr. So kann beispielsweise null in Java verwendet werden.
quelle
In Java gibt es zwei Hauptkategorien von Typen: Primitiv und Referenz . Variablen, die für Speicherwerte eines primitiven Typs deklariert wurden; Variablen, die von einem Referenztyp deklariert wurden, speichern Referenzen.
In diesem Fall deklariert die Initialisierungsanweisung eine Variable "x". "X" speichert die String-Referenz. Hier ist es null . Erstens ist null keine gültige Objektinstanz, daher ist ihr kein Speicher zugewiesen. Es ist einfach ein Wert, der angibt, dass sich die Objektreferenz derzeit nicht auf ein Objekt bezieht.
quelle
Eine interessante Möglichkeit, meiner Meinung nach null in Java zu sehen, besteht darin, es als etwas zu betrachten, das NICHT das Fehlen von Informationen bedeutet, sondern einfach als einen wörtlichen Wert, der einer Referenz eines beliebigen Typs zugewiesen werden kann. Wenn Sie darüber nachdenken, ob es sich um das Fehlen von Informationen handelt, ist es nicht sinnvoll, dass a1 == a2 wahr ist (falls beiden der Wert null zugewiesen wurde), da sie tatsächlich auf ein beliebiges Objekt verweisen könnten (wir einfach Ich weiß nicht, auf welche Objekte sie zeigen sollen.) ... Übrigens gibt null == null in Java true zurück. Wenn Java zB wie SQL: 1999 wäre, würde null == null unbekannt zurückgeben (ein boolescher Wert in SQL: 1999 kann drei Werte annehmen: wahr, falsch und unbekannt, aber in der Praxis wird unbekannt in realen Systemen als null implementiert) ... http://en.wikipedia.org/wiki/SQL
quelle
Kurze und präzise Antwort, die alle Ihre Fragen formell von JLS beantwortet:
Es wird nur eine Referenz vom Typ zugewiesen, die null zugewiesen ist. Sie weisen der Referenz keinen Wert (Objekt) zu. Eine solche Zuordnung ist spezifisch für JVM, wie viel Referenz benötigt wird und in welchem Speicherbereich sie zugewiesen wird.
quelle