web-dev-qa-db-fra.com

Pourquoi les types de données primitifs ne peuvent-ils pas être "nuls" en Java?

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?

30
MBMJ

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!

49
Miquel

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.

15
Polygnome

Parce que les types de données primitifs en Java ne sont pas Objects. 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: 

  • octet: Java.lang.Byte
  • short: Java.lang.Short
  • int: Java.lang.Integer
  • long: Java.lang.Long
  • float: Java.lang.Float
  • double: Java.lang.Double
  • booléen: Java.lang.Boolean
  • char Java.lang.Character

Si vous êtes intéressé par la structure entière, vous pouvez démarrer ici (Types de données primitifs) .

9
brimborium

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.

5

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. 

3
Chris

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

3
duduamar

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.

1
Shoaib Chikate

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"

1
Yel