Ist null ein Objekt?


119

Ist null ein Objectin Java?


41
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.

Und das sagt die Java-Sprachspezifikation zu diesem Thema:

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.


1
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 .


8
null ist ein Typ und ein Wert.
Joachim Sauer

5
Der nullName ist nullanscheinend eine "Instanz" des Typs.
Strager

nullist keine Variable, sondern ein Literal: JLS, 3.10.7. Das Null-Literal
Gerold Broser

Re " nullist 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 das nullLiteral zugewiesen werden kann . ... Fortsetzung ...
Gerold Broser

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



12

Null ist das Fehlen eines Objekts.


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."
Ken


12

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 nullLiteral 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 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 ):

  1. Der (ansonsten unbenannte) Nulltyp .
  2. Das null Wörtliche .
  3. 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 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:

     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 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".


2
Apple und null? Haben Sie keine Angst vor einer Klage? :)
Gábor Lipták

9

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.


5

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 .



4

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.


3
In der Tat null instanceof <anytype>wird auch zurückkehren false.
Bombe

4

Nach dem Java Spec ,

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.


4

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.


3

Ist null eine Instanz von java.lang.Object? Nein.

Ist null ein Objekt ? hängt von der Definition von " ist " ab.


2
Object foo = null;
System.out.println(foo.toString()); 

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.