Lors de la déclaration de données de type primitif comme int
ou double
, elles sont initialisées à 0
ou 0.0
. Pourquoi ne pouvons-nous pas les définir sur null
?
Un type primitif n'est que des données. Ce que nous appelons des objets, par contre, ne sont que des indicateurs de l'endroit où les données sont stockées. Par exemple:
Integer object = new Integer(3);
int number = 3;
Dans ce cas, object
est simplement un pointeur sur un objet Integer dont la valeur est 3. Cela signifie que, à la position de mémoire où l'objet variable est stocké, tout ce que vous avez est une référence à l'emplacement réel des données. Par contre, la position de mémoire où number
est stocké contient directement la valeur 3.
Donc, vous pouvez définir la variable object
sur null, mais cela voudrait simplement dire que les données de cet objet sont à null (c'est-à-dire, non affectées). Vous ne pouvez pas définir un int sur null, car le langage l'interpréterait comme étant la valeur 0.
J'espère que cela pourra aider!
Parce que null est une référence. Et les types primitifs ne sont pas des types de référence. Seuls les objets sont des types de référence.
Parce que les types de données primitifs en Java ne sont pas Object
s. Vous pouvez toujours utiliser l'une des classes wrapper pour avoir une Object
. Chacun des huit types de données primitifs a son wrapper correspondant:
Java.lang.Byte
Java.lang.Short
Java.lang.Integer
Java.lang.Long
Java.lang.Float
Java.lang.Double
Java.lang.Boolean
Java.lang.Character
Si vous êtes intéressé par la structure entière, vous pouvez démarrer ici (Types de données primitifs) .
Parce que c'est ce que dit la norme linguistique.
Si vous voulez pouvoir passer null
, vous devez utiliser les types de wrapper , par exemple. Integer
au lieu de int
.
Les objets impliquent plus de frais généraux que les primitives. Le test suivant montre que int fonctionne environ 10 fois plus vite que Integer.
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());
C’est la raison pour laquelle les primitives nullables implémentées par .net, Java n’a malheureusement pas de primitives nullables.
Parce qu’il s’agit d’un type primitif et non d’un objet . Vous pouvez utiliser l’objet correspondant pour chaque type si vous avez besoin de la possibilité d’utiliser des valeurs NULL (double pour long, long pour long, booléen pour booléen, etc.)
Avec tous les réponses ci-dessus je voudrais ajouter ce point aussi.
Pour les types primitifs, nous avons une taille de mémoire fixe, c’est-à-dire que pour int, nous avons 4 octets et char nous avons 2 octets. Et null est utilisé uniquement pour les objets car la taille de la mémoire n’est pas fixée.
Donc par défaut nous avons,
int a=0;
et pas
int a=null;
Idem avec les autres types primitifs et donc null n'est utilisé que pour les objets et non pour les types primitifs.
Tout d’abord, la différence entre Primitive et Référence d’objet est que la variable Primitive stocke les valeurs réelles, alors que la variable de référence d’objet stocke l’adresse de l’objet auquel elle se réfère, dans ce cas, dans la référence de l’objet, s’il n’ya pas d’adresse, elle passera " nul".
Les valeurs par défaut du type de données Primitive dépendent du type de données primitif: comme byte = 0, short = 0, int = 0, long = 0L, float = 0.0f, double = 0.0d, booléen = false, char = "\ u0000" .
Lorsque nous déclarons une variable de tout type de classe, elle est appelée type de données de référence.
EX:
Test t1
Test t2
(Types d'encapsuleur d'objet)
Entier i
Long l
Valeurs par défaut des références d'objet, Jvm initialise la variable de référence sous la forme "null" et initialisera également le tableau sur "null"