2013-10-22 4 views
19

Diese in Fortsetzung meiner vorherigen Frage und Accroding, um Antworten auf diese Frage Declaration of wrapper classesWarum Java nicht null zulassen, während primitive Datentypen deklarieren

Java hüllt primitive Datentypen Klassen-Wrapper warum dann

char c = null; // invalid 
int i = null; // invalid 

ist nicht erlaubt, aber

Character cObj = null; // valid 
Integer iObj = null; // valid 

ist zulässig.

+3

Da primitive Typen * nicht * "null" sein können. – qqilihq

+0

Da ein Ganzzahlwert leer ist, wird alwez 0 und niemals null sein. (im Falle eines int) –

+1

@qqilihq :) das ist meine Frage warum? wie Java Wrapping dann warum Java nicht primitive Datentypen einpacken und erlauben 'null' Werte – Vishrant

Antwort

36

Da Primitive repräsentieren Wert und Objektvariablen repräsentieren Referenzen (so etwas wie Zeiger) bis hin zu komplexen Datenobjekten. Es gibt keinen Nullwert allgemein, es ist ein spezielles Schlüsselwort, das "auf nichts verweist" oder eine leere Referenz - das ist höchst unprofessionelle Antwort, aber ich denke, es wird am besten geeignet sein.

Außerdem, was könnte Ihrer Meinung nach numerischen Wert von Null sein? 0? -1? Aber das sind gültige Ganzzahlen also was sonst noch?

Ich empfehle dringend, dass Sie sich mit den folgenden Schritten vertraut machen: complex java tutorial. Jeder Aspekt, nach dem Sie gefragt haben, wird dort erklärt und durch Beispiele unterstützt.

30

null bedeutet "Fehlen eines Objekts". Referenzen können ein Objekt vermissen, Primitive nicht.

+0

Kann ich 'Byte b = null; Byte b1 = b; '? *** Byte MinValue ***? – Kiquenet

+0

Sicher kannst * du *, aber du bekommst einen Nullzeiger, wenn 'b' nichtboxiert ist. – Kayaman

+0

*** Sicher Weg, um Byte/Integer zu Byte/Int zu konvertieren? – Kiquenet

2

Java-Primitivtyp-Variablen sind Store-by-Value- anstelle von Store-by-Reference-Variablen. Die Wrapper-Klassen sind Objekte, die grundsätzlich wie jedes andere Java-Objekt sind, außer dass sie nur einen primitiven Typ umschließen.

0

Objekte wie Character und Integer sind Zeiger: Die tatsächliche Zahl, die in den Bytes gespeichert ist, die der Wert dieser Variablen sind, stellt eine Adresse im Speicher für den Rest des JVM-Speichers dar. Es ist also möglich und sinnvoll, diese Zahl auf eine Adresse zu setzen, die nirgendwohin geht, was null ist.

Ein Primitiv wie int oder char hat jedoch eine Zahl, die als Zahl interpretiert wird (Ganzzahl oder ASCII-Code), und es gibt keine Möglichkeit, "keine Zahl" zu machen, weil der gesamte Speicher möglicherweise gespeichert werden kann ist Zahlen.

1

Die Referenzwerte (oft nur Referenzen) sind Zeiger auf diese Objekte und eine spezielle Nullreferenz, die auf kein Objekt verweist.

Per jls-4.3.1, ist es sinnlos, über die null Referenz ohne die Existenz eines Objekts zu nehmen.

0

Mit Bezug auf Unboxing/Autoboxing, müssen Sie sich vorstellen, wie sind zwei Möglichkeiten, die der Compiler annehmen, um verrückt mit kontinuierlichen "Casting" von primitiven zu Objekt und umgekehrt, aber sie sind nicht einwandfrei.

Was passiert, wenn der Integer-Wrapper null ist und Sie eine Division erstellen? Keine Division durch 0, sondern eine Null-Zeiger-Ausnahme, weil Java ein nicht referenziertes Objekt nicht auspacken kann!

So ist es sicher und logisch, verschiedene Init-Regeln für Primitive und Objekte zu behalten.

1

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

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

So standardmäßig haben wir

int a=0; 

und nicht

int a=null; 

Gleiche mit anderen primitiven Typen und daher null ist nur für Objekte und nicht für primitive Typen verwendet.

+1

Ich denke nicht, dass dies die richtige Antwort ist, vor allem in Java Char ist nicht von 1 Byte es ist von 2 Bytes aus einem bestimmten Grund, bitte suchen Sie Google, und ich hörte nie über 32bit und 64bit primitiven Typ Java, da dies die erste Bedingung für Java ist, OS-unabhängig zu sein. – Vishrant

+0

Dank bro, nur die Antwort erklärt und dachte nicht an die Zeichen Speicherplatz und in meinem Kopf war String mit einem Zeichen und so kommt es zu 1 Byte. Aber seine 2 Bytes –

Verwandte Themen