JRL schrieb:
Nein, ist es nicht, ...
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 Typ Object
?”. Zusätzlich zu JLS 4.1, zitiert von Michael Borgwardt oben:
Siehe JLS 3.10.7 :
Ein Null-Literal ist immer vom Null-Typ.
und JLS 4.10 :
Die Untertypen eines Typs T sind alle Typen U, so dass T ein Supertyp von U und der Nulltyp ist.
oder JLS 4.10.2 :
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 boolean
null.toString(); // Cannot invoke toString() on the primitive type null
Laut OpenJDKs 12.0.1 ist javac
es :
true.toString(); // error: boolean cannot be dereferenced
null.toString(); // error: <null> cannot be dereferenced
Wo die spitzen Klammern bedeuten, dass null
es 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 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:
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
null
Wö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();
Beachten Sie auch JLS 3.9 :
Eine Vielzahl von Zeichenfolgen wird manchmal fälschlicherweise als Schlüsselwort angenommen:
Ü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 werden true
, nicht wahr ? Auf den ersten Blick ja, aber JLS 15.20.2 gibt die Einsichtsantwort:
[...] das Ergebnis des instanceof
Operators ist, true
wenn der Wert von RelationalExpression nichtnull
[...] ist. Ansonsten ist das Ergebnisfalse
.
[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 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:
class Car implements Vehicle {
...
Vehicle car = null;
...
boolean b = car instanceof Car; // True? There's not even an instance
... // which could be of type Car.
Was auch führt zu:
Warum ist es instanceof
nicht richtig, etwas über null
die Objektivität zu sagen ?
Es heißt instanceof
nicht sameorsubtypeof
. Das heißt, wir vergleichen den Typ einer Instanz mit einem Typ, nicht mit zwei Typen. Jetzt null
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 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".