it-swarm.com.de

Warum können primitive Datentypen in Java nicht "null" sein?

Beim Deklarieren von primitiven Datentypen wie int oder double werden sie mit 0 oder 0.0 initialisiert. Warum können wir sie nicht auf null setzen?

30
MBMJ

Ein primitiver Typ besteht nur aus Daten. Was wir dagegen Objekte nennen, sind nur Hinweise darauf, wo die Daten gespeichert sind. Zum Beispiel:

Integer object = new Integer(3);
int number = 3;

In diesem Fall ist object nur ein Zeiger auf ein Integer-Objekt, dessen Wert 3 lautet. Das heißt, an der Speicherposition, an der das Variablenobjekt gespeichert ist, haben Sie nur einen Verweis darauf, wo sich die Daten wirklich befinden. Die Speicherposition, an der number gespeichert ist, enthält dagegen direkt den Wert 3.

Sie könnten also die Variable object auf null setzen, dies würde jedoch nur bedeuten, dass die Daten dieses Objekts in null sind (dh nicht zugewiesen sind). Sie können ein int nicht auf null setzen, da die Sprache dies als Wert 0 interpretieren würde.

Hoffentlich hilft das!

49
Miquel

Weil null eine Referenz ist. Und Primitivtypen sind keine Referenztypen. Nur Objekte sind Referenztypen.

15
Polygnome

Weil primitive Datentypen in Java nicht Objects sind. Sie können immer eine der Wrapper-Klassen verwenden, um eine Object zu erhalten. Jeder der acht primitiven Datentypen hat seinen entsprechenden Wrapper: 

  • byte: Java.lang.Byte
  • kurz: Java.lang.Short
  • int: Java.lang.Integer
  • long: Java.lang.Long
  • float: Java.lang.Float
  • doppelt: Java.lang.Double
  • boolean: Java.lang.Boolean
  • char Java.lang.Character

Wenn Sie sich für die gesamte Struktur interessieren, können Sie hier (Primitive Datentypen) starten.

9
brimborium

Denn das sagt der Sprachstandard.

Wenn Sie null übergeben möchten, sollten Sie die Wrapper-Typen verwenden, z. Integer statt int.

5

Objekte erfordern mehr Aufwand als Primitive. Der folgende Test zeigt, dass int etwa 10x schneller als Integer ist. 

int n;
EtmPoint point1 = etmMonitor.createPoint("test:objects");
for (n = 0; n < 1000000; n++) {
    Integer t = 0;
    t = 10;
    t = 11;
}

point1.collect();
EtmPoint point = etmMonitor.createPoint("test:primitives");
for (n = 0; n < 1000000; n++) {
    int t = 0;
    t = 10;
    t = 11;
}
point.collect();

etmMonitor.render(new SimpleTextRenderer());

Aus diesem Grund hat .net nullfähige Grundelemente implementiert, leider verfügt Java nicht über nullfähige Grundelemente. 

3
Chris

Weil es sich um einen primitiven Typ handelt und nicht um ein Objekt. Sie können das entsprechende Objekt für jeden Typ verwenden, wenn Sie die Verwendung von Nullwerten benötigen (z. B. Double für double, Long für long, Boolean für boolean usw.).

3
duduamar

Zusammen mit der obigen Antwort möchte ich auch diesen Punkt hinzufügen.

Für primitive Typen haben wir eine feste Speichergröße, d. H. Für int haben wir 4 Bytes und char 2 Bytes. Und null wird nur für Objekte verwendet, da die Speichergröße nicht festgelegt ist. 

Also haben wir standardmäßig,

   int a=0;

und nicht

   int a=null;

Gleich wie bei anderen Grundtypen und daher wird Null nur für Objekte und nicht für Grundtypen verwendet.

1
Shoaib Chikate

Die Differenz zwischen Primitiv und Objektreferenz ist zunächst die Primärwertvariable, die die tatsächlichen Werte speichert. Während die Objektreferenzvariable die Adresse des Objekts speichert, auf das sie sich beziehen. In diesem Fall in der Objektreferenz, wenn keine Adresse vorhanden ist, wird sie an " Null".

Die Standardwerte des primitiven Datentyps hängen vom primitiven Datentyp ab: Wie Byte = 0, Short = 0, Int = 0, Long = 0L, Float = 0.0f, Double = 0.0d, Boolean = false, Char = "\ u0000" . 

Wenn wir eine Variable eines beliebigen Klassentyps deklarieren, wird sie als Referenzdatentyp bezeichnet.

EX: 

Test t1

Test t2

(Objekt-Wrapper-Typen)

Integer i

Lang l

Objektreferenz-Standardwerte, Jvm initialisiert die Referenzvariable als "null" und initialisiert auch das Array auf "null".

1
Yel