Nein, ist es nicht, und für diejenigen, die sich fragen, warum eine solche Frage gestellt wird, gibt es Sprachen, in denen null tatsächlich ein Objekt wie jedes andere ist, zum Beispiel Ruby.
JRL
7
In Scala, das sich sehr genau mit Typen befasst, gibt es einen Typ Null( eigentlich ein Merkmal ) mit einer einzelnen Instanz null.
Carl Smotricz
1
@ JRL: Nur aus Neugier frage ich mich, wie das die Funktionsweise von JRuby beeinflusst ... (Ich bin mit dieser Implementierungsstufe nicht vertraut genug, um es genau zu wissen.)
Benjamin Oakes
Um @ JRLs Kommentar hinzuzufügen - Rubys grobes Äquivalent zu nullist nil, was eine Instanz von NilClass ist
Eliot Sykes
Oder Javascript, in dem null instanceof Objectfalsch ist, aber typeof(null)zurückkehrt 'object'. Ist es in diesem Fall ein Objekt? Wer weiß.
Don Hatch
Antworten:
166
Wenn null ein Objekt wäre, würde es die Methoden von java.lang.Objectz equals(). Dies ist jedoch nicht der Fall - jeder Methodenaufruf für eine Null führt zu a NullPointerException.
Es gibt auch einen speziellen Nulltyp, den Typ des Ausdrucks null, der keinen Namen hat. Da der Nulltyp keinen Namen hat, ist es unmöglich, eine Variable vom Nulltyp zu deklarieren oder in den Nulltyp umzuwandeln. Die Nullreferenz 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 Referenztyp sein kann.
Ich denke, das kann auf "null ist etwas Besonderes" reduziert werden.
Ein Objekt in Java ist also nur dann ein Objekt, wenn es gleich oder unterklassig ist java.lang.Object. Praktisch - ja. Sie können keine Klasse erstellen, die keine Unterklasse von java.lang.Object ist, aber ich habe nie aus philosophischer Sicht darüber nachgedacht
Andreas Dolk
Seltsamerweise erwähnt das API-Dokument fürNullPointerException ein » nullObjekt«… :) Aber dann war es auch in Ordnung, über »Nullzeiger« zu sprechen…
Lumi
Sie sagten: "Die Nullreferenz kann immer in einen beliebigen Referenztyp umgewandelt werden." Können wir also in einer Methode mit einem Objektreferenztyp (return) null (typecasted - falls zulässig) zurückgeben?
Srichakradhar
1
@ Richakradhar: Ja, wir können! Was Sie leichter herausfinden können, wenn Sie es im Code versuchen, als wenn Sie hier fragen.
Michael Borgwardt
1
"Die Nullreferenz ist der einzig mögliche Wert eines Ausdrucks vom Typ Null". Es ist Zeit, das Dokument mit den technischen Daten zu lesen. :)
sofs1
32
Gemäß der Java - Spezifikation , nullist ein Typ, der zu einer Objektvariablen zugeordnet werden kann (als Wert wie im Kommentar angegeben). Sie können jedoch keine Variablen dieses Typs instanziieren oder erstellen. Sie müssen das nullvom Compiler bereitgestellte Literal verwenden .
3) Objekt in " Objektvariable " bezieht sich im Vergleich zur Klassenvariablen normalerweise nicht auf den Typ, sondern auf die Lebensdauer. Wenn auf den Typ Bezug genommen wird, wird er normalerweise als Variable eines Referenztyps oder kurz als Referenzvariable (Typvariable) bezeichnet. Mir sind 4 Typen in der Java-API bekannt, die Instanz- / Objektvariablen verfügbar machen (möglicherweise mehr): Arrays mit ihrenlength und den Unterklassen von java.awt.geom.Point2D.
Gerold Broser
28
Absolut nicht: null instanceof ObjectGibt false zurück.
Der Nulltyp kann jedoch jedem Referenztyp zugewiesen werden.
Tom Hawtin - Tackline
Es gibt keinen "Null-Typ"; null ist ein spezifischer Wert nicht-primitiver Ausdrücke (dh Referenzen; meines Wissens gibt es auch in Java keinen "Referenztyp").
Tommy McGuire
3
Tommy: JLS 4.1: "Es gibt auch einen speziellen Nulltyp, den Typ des Ausdrucks null, der keinen Namen hat."
Wie so oft kommt es darauf an, wo man es betrachtet, wem man mehr glaubt.
Nach dem JLS, ja, es ist . Vor allem, wenn Sie die Frage wie folgt umformulieren: „Ist das nullLiteral vom Typ Object?”. Zusätzlich zu JLS 4.1, zitiert von Michael Borgwardt oben:
Die direkten Supertypen des Nulltyps sind alle Referenztypen außer dem Nulltyp selbst.
[Hervorhebungen von mir.]
Laut dem Compiler von Eclipse 2019-09 ist es nicht :
true.toString();// Cannot invoke toString() on the primitive type booleannull.toString();// Cannot invoke toString() on the primitive type null
Laut OpenJDKs 12.0.1 ist javaces :
true.toString();// error: boolean cannot be dereferencednull.toString();// error: <null> cannot be dereferenced
Wo die spitzen Klammern bedeuten, dass nulles sich um einen anderen als einen primitiven Typ handelt. Und laut JLS 4.1 :
In der Programmiersprache Java gibt es zwei Arten von Typen: primitive Typen (...) und Referenztypen (...).
Wenn es nicht das eine ist, ist es das andere.
Claudiu schrieb:
null ist irgendwie hässlich.
Au contraire nullist wunderschön. Was würden Sie stattdessen als Standardwert für eine Referenztypvariable vorschlagen? Eine beliebige Bitkombination? Willkommen bei Zugriffsverletzungen oder, noch schlimmer, Zeiger Hölle!
Joachim Sauer schrieb:
null ist ein Typ und ein Wert.
Es gibt tatsächlich drei Elemente in Verbindung mit null (siehe auch JLS 3.10.7 ):
Der (ansonsten unbenannte) Nulltyp .
Das nullWörtliche .
Der Nullreferenzwert . (Allgemein abgekürzt als Nullwert oder einfach null ) .
(1) Man beachte , daß nach JLS 4.10.2 wie oben zitiert, der Null - Typ verwendet , die mehrfache Vererbung nicht nur für die Schnittstellen , sondern für Klassen. Was wir alle wissen, ist für uns Anwendungsprogrammierer nicht möglich.
(2) Das Nullliteral kann als eine Variable vorgestellt werden, die definiert wird als:
JVM_global final null_type null = new null_type();
Mit Blick auf JLS 4.10.2 („der Null-Typ ist ein Subtyp jedes Typs”) null instanceof <any type>sollte ausgewertet werden true, nicht wahr ? Auf den ersten Blick ja, aber JLS 15.20.2 gibt die Einsichtsantwort:
[...] das Ergebnis des instanceofOperators ist, truewenn der Wert von RelationalExpression nichtnull [...] ist. Ansonsten ist das Ergebnisfalse .
[Hervorhebungen von mir.]
Fragen Sie sich, was (aus Sicht eines Anwendungsprogrammierers) sinnvoller ist:
Geben falseund damit anzeigen, dass ein Referenzausdruck nicht von einem Typ ist, der uns ausgesetzt ist, dh anzeigen, dass er nichts Nützliches für uns referenziert
oder geben true, um uns zu informieren, dass der Ausdruck eine spezielle Referenz ergibt , die Nullreferenz , die auf ein "Objekt" verweist, von dem wir nicht wissen, ob es überhaupt existiert und das vom speziellen Nulltyp ist, der keinen Namen hat, ist nicht ausgesetzt Ist uns aber über das Null-Literal ein Subtyp eines beliebigen Typs einschließlich Mehrfachvererbung und ist er trotzdem zu ignorieren? Betrachten Sie auch das praktischere Beispiel:
classCarimplementsVehicle{...Vehicle car =null;...boolean b = car instanceofCar;// True? There's not even an instance...// which could be of type Car.
Was auch führt zu:
Warum ist es instanceofnicht richtig, etwas über nulldie Objektivität zu sagen ?
Es heißt instanceofnicht sameorsubtypeof. Das heißt, wir vergleichen den Typ einer Instanz mit einem Typ, nicht mit zwei Typen. Jetzt nullheißt es: „Es gibt keine Instanz” und wenn es keine Instanz gibt, gibt es keinen Instanztyp. Es ist offensichtlich, dass der Vergleich von nichts mit etwas dazu führen soll false.
Oder in einem "realistischeren" Beispiel:
Ich habe ein Originalbild eines Apfels ( = Referenztyp ) in der Hand, auf dem »Big Apple« ( = Name des Referenztyps ) steht.
Vor mir steht ein Tisch ( = Haufen ).
Wenn sich ein Apfel ( = Instanz ) auf dem Tisch befindet, ist eine Schnur ( = Referenz ) daran angeschlossen.
Ich halte das andere Ende dieser Schnur in meiner Hand ( = Referenzvariable ).
Ich verfolge den Apfel entlang der Schnur und vergleiche ihn mit meinem Bild ( = Instanz von ).
Wenn der Apfel gleich groß oder größer als das Bild ist, gilt für ihn die Aufschrift »Big Apple« ( = true ).
Wenn es kleiner ist, dann nicht ( = falsch ).
Wenn sich kein Apfel auf dem Tisch befindet (= keine Instanz ) und daher keine Schnur vorhanden ist ( = null ), gilt das Schreiben auch nicht ( = false ). Denn: Ist kein Apfel ein großer Apfel? Nein, ist es nicht.
Wie Michael zusammenfasst: "Null ist etwas Besonderes".
Wie in Kapitel 4.1 Die Arten von Typen und Werten der Java-Sprachspezifikation erläutert , ist null ein Typ mit einem Wert, der Nullreferenz (und wird durch das Literal dargestellt null):
Es gibt auch einen speziellen Nulltyp , den Typ des Ausdrucks null, der keinen Namen hat. Da der Nulltyp keinen Namen hat, ist es unmöglich, eine Variable vom Nulltyp zu deklarieren oder in den Nulltyp umzuwandeln. Die Nullreferenz 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, nullals wäre dies nur ein spezielles Literal, das von einem beliebigen Referenztyp sein kann.
Vielleicht möchten Sie jedoch etwas über das Null-Objektmuster lesen (das ich nicht empfehle). Weitere Informationen zu diesem Muster finden Sie im C2-Wiki oder in Wikipedia .
Es gibt auch ein spezielles Null-Literal, das als Wert für jeden Referenztyp verwendet werden kann. null kann jeder Variablen zugewiesen werden, mit Ausnahme von Variablen primitiver Typen. Es gibt wenig, was Sie mit einem Nullwert tun können, außer auf seine Anwesenheit zu testen. Daher wird in Programmen häufig null als Markierung verwendet, um anzuzeigen, dass ein Objekt nicht verfügbar ist.
Java behandelt Objekte über Referenzen. Null ist eine Aufschlüsselung der OO-Ness von Java, da Sie dadurch unter das OO-Niveau fallen. Nein, es ist kein Objekt, es ist ein Wert einer Referenz. Und es hat nichts mit Objektparadigmen zu tun, sondern bezieht sich auf die Installation von Java, die Objekte ermöglicht.
Die erste Zeile zeigt, nulldass der Typ zugewiesen werden kann Object, aber die zweite Zeile zeigt, dass es sich sicherlich nicht um eine handelt, Objectund führt schließlich zu einerjava.lang.NullPointerException
Null
( eigentlich ein Merkmal ) mit einer einzelnen Instanznull
.null
istnil
, was eine Instanz von NilClass istnull instanceof Object
falsch ist, abertypeof(null)
zurückkehrt'object'
. Ist es in diesem Fall ein Objekt? Wer weiß.Antworten:
Wenn null ein Objekt wäre, würde es die Methoden von
java.lang.Object
zequals()
. Dies ist jedoch nicht der Fall - jeder Methodenaufruf für eine Null führt zu aNullPointerException
.Und das sagt die Java-Sprachspezifikation zu diesem Thema:
Ich denke, das kann auf "null ist etwas Besonderes" reduziert werden.
quelle
java.lang.Object
. Praktisch - ja. Sie können keine Klasse erstellen, die keine Unterklasse von java.lang.Object ist, aber ich habe nie aus philosophischer Sicht darüber nachgedachtNullPointerException
ein »null
Objekt«… :) Aber dann war es auch in Ordnung, über »Nullzeiger« zu sprechen…Gemäß der Java - Spezifikation ,
null
ist ein Typ, der zu einer Objektvariablen zugeordnet werden kann (als Wert wie im Kommentar angegeben). Sie können jedoch keine Variablen dieses Typs instanziieren oder erstellen. Sie müssen dasnull
vom Compiler bereitgestellte Literal verwenden .quelle
null
Name istnull
anscheinend eine "Instanz" des Typs.null
ist keine Variable, sondern ein Literal: JLS, 3.10.7. Das Null-Literalnull
ist ein Typ, der zugewiesen werden kann ": 1)null
(im Code) ist das Null-Literal , nicht der Null-Typ 2) Typen können Variablen in Java im Allgemeinen nicht zugewiesen werden, siehe JLS 4.1: " Es gibt [... ] zwei Arten von Datenwerten, die in Variablen [...] gespeichert werden können: Grundwerte (§4.2) und Referenzwerte (§4.3). " Es ist die Nullreferenz , die über dasnull
Literal zugewiesen werden kann . ... Fortsetzung ...length
und den Unterklassen vonjava.awt.geom.Point2D
.Absolut nicht:
null instanceof Object
Gibt false zurück.quelle
Nein, es ist kein Objekt.
quelle
Null ist das Fehlen eines Objekts.
quelle
JRL schrieb:
Wie so oft kommt es darauf an, wo man es betrachtet, wem man mehr glaubt.
Nach dem JLS, ja, es ist . Vor allem, wenn Sie die Frage wie folgt umformulieren: „Ist das
null
Literal vom TypObject
?”. Zusätzlich zu JLS 4.1, zitiert von Michael Borgwardt oben:Siehe JLS 3.10.7 :
und JLS 4.10 :
oder JLS 4.10.2 :
[Hervorhebungen von mir.]
Laut dem Compiler von Eclipse 2019-09 ist es nicht :
Laut OpenJDKs 12.0.1 ist
javac
es :Wo die spitzen Klammern bedeuten, dass
null
es sich um einen anderen als einen primitiven Typ handelt. Und laut JLS 4.1 :Wenn es nicht das eine ist, ist es das andere.
Claudiu schrieb:
Au contraire
null
ist wunderschön. Was würden Sie stattdessen als Standardwert für eine Referenztypvariable vorschlagen? Eine beliebige Bitkombination? Willkommen bei Zugriffsverletzungen oder, noch schlimmer, Zeiger Hölle!Joachim Sauer schrieb:
Es gibt tatsächlich drei Elemente in Verbindung mit null (siehe auch JLS 3.10.7 ):
null
Wörtliche .(1) Man beachte , daß nach JLS 4.10.2 wie oben zitiert, der Null - Typ verwendet , die mehrfache Vererbung nicht nur für die Schnittstellen , sondern für Klassen. Was wir alle wissen, ist für uns Anwendungsprogrammierer nicht möglich.
(2) Das Nullliteral kann als eine Variable vorgestellt werden, die definiert wird als:
JVM_global final null_type null = new null_type();
Beachten Sie auch JLS 3.9 :
Über
null instanceof <any type>
Mit Blick auf JLS 4.10.2 („der Null-Typ ist ein Subtyp jedes Typs”)
null instanceof <any type>
sollte ausgewertet werdentrue
, nicht wahr ? Auf den ersten Blick ja, aber JLS 15.20.2 gibt die Einsichtsantwort:[Hervorhebungen von mir.]
Fragen Sie sich, was (aus Sicht eines Anwendungsprogrammierers) sinnvoller ist:
Geben
false
und damit anzeigen, dass ein Referenzausdruck nicht von einem Typ ist, der uns ausgesetzt ist, dh anzeigen, dass er nichts Nützliches für uns referenziertoder geben
true
, um uns zu informieren, dass der Ausdruck eine spezielle Referenz ergibt , die Nullreferenz , die auf ein "Objekt" verweist, von dem wir nicht wissen, ob es überhaupt existiert und das vom speziellen Nulltyp ist, der keinen Namen hat, ist nicht ausgesetzt Ist uns aber über das Null-Literal ein Subtyp eines beliebigen Typs einschließlich Mehrfachvererbung und ist er trotzdem zu ignorieren? Betrachten Sie auch das praktischere Beispiel:Was auch führt zu:
Warum ist es
instanceof
nicht richtig, etwas übernull
die Objektivität zu sagen ?Es heißt
instanceof
nichtsameorsubtypeof
. Das heißt, wir vergleichen den Typ einer Instanz mit einem Typ, nicht mit zwei Typen. Jetztnull
heißt es: „Es gibt keine Instanz” und wenn es keine Instanz gibt, gibt es keinen Instanztyp. Es ist offensichtlich, dass der Vergleich von nichts mit etwas dazu führen sollfalse
.Oder in einem "realistischeren" Beispiel:
Wie Michael zusammenfasst: "Null ist etwas Besonderes".
quelle
Nein, es ist weder eine Instanz einer Klasse noch eine Klasse. Es ist ein Hinweis auf nichts.
Bearbeiten : Ich habe die Spezifikation nicht gelesen, daher ist die obige Spezifikation möglicherweise nicht 100% genau.
quelle
Wie in Kapitel 4.1 Die Arten von Typen und Werten der Java-Sprachspezifikation erläutert , ist null ein Typ mit einem Wert, der Nullreferenz (und wird durch das Literal dargestellt
null
):Vielleicht möchten Sie jedoch etwas über das Null-Objektmuster lesen (das ich nicht empfehle). Weitere Informationen zu diesem Muster finden Sie im C2-Wiki oder in Wikipedia .
quelle
Nein. Selbst wenn es so wäre, ist es nutzlos, da es keine Methoden oder Felder hat.
quelle
Nein, ist kein Objekt, da die Nullinstanz von Object immer false zurückgibt. Außerdem gibt es nur eine Null, nicht eine für jede Klasse.
quelle
null instanceof <anytype>
wird auch zurückkehrenfalse
.Nach dem Java Spec ,
quelle
Java behandelt Objekte über Referenzen. Null ist eine Aufschlüsselung der OO-Ness von Java, da Sie dadurch unter das OO-Niveau fallen. Nein, es ist kein Objekt, es ist ein Wert einer Referenz. Und es hat nichts mit Objektparadigmen zu tun, sondern bezieht sich auf die Installation von Java, die Objekte ermöglicht.
quelle
Ist null eine Instanz von
java.lang.Object
? Nein.Ist null ein Objekt ? hängt von der Definition von " ist " ab.
quelle
Die erste Zeile zeigt,
null
dass der Typ zugewiesen werden kannObject
, aber die zweite Zeile zeigt, dass es sich sicherlich nicht um eine handelt,Object
und führt schließlich zu einerjava.lang.NullPointerException
quelle
Nein,
null
ist kein Objekt. Es ist ein Referenztyp und sein Wert bezieht sich nicht auf ein Objekt und daher gibt es keine Darstellungnull
im Speicher.quelle
Object
, nicht nach dem Objekt (wie bei einem Typ ). Und wenn man die Frage entsprechend umformuliert ...