web-dev-qa-db-fra.com

Null est-il un objet?

Null est-il un Object en Java?

118
Registered User

Si null était un objet, il prendrait en charge les méthodes de Java.lang.Object Telles que equals(). Cependant, ce n'est pas le cas - toute invocation de méthode sur un null entraîne un NullPointerException.

Et voici ce que la Java Language Specification a à dire sur ce sujet:

Il existe également un type null spécial, le type de l'expression null, qui n'a pas de nom. Étant donné que le type nul n'a pas de nom, il est impossible de déclarer une variable du type nul ou de transtyper en type nul. La référence null est la seule valeur possible d'une expression de type null. La référence nulle peut toujours être convertie en n'importe quel type de référence. En pratique, le programmeur peut ignorer le type nul et prétendre simplement que null est simplement un littéral spécial qui peut être de n'importe quel type de référence.

Je pense que cela peut se résumer à "null is special".

165
Michael Borgwardt

Selon le Java spec , null est un type qui peut être assigné à une variable objet (comme une valeur comme indiqué dans le commentaire). Cependant, vous ne pouvez pas instancier ou créer des variables de ce type, vous devez utiliser le littéral null fourni par le compilateur.

31
Dana the Sane

Absolument pas: null instanceof Object renvoie faux.

28
Darin Dimitrov

Non, ce n'est pas un objet.

12
Erich Kitzmueller

Null est le manque d'objet.

12
Tommy Carlier

JRL a écrit:

Non ce n'est pas, ...

Comme souvent, cela dépend d'où vous le regardez, à qui vous croyez le plus.

Selon le JLS, oui, c'est . Surtout si vous reformulez la question en: "Le null est-il littéral de type Object?". En plus de JLS 4.1 cité par Michael Borgwardt ci-dessus:

Voir JLS 3.10.7 :

Un littéral nul est toujours de type nul.

et JLS 4.1 :

Les sous-types d'un type T sont tous des types U tels que T est un supertype de U, et le type nul.

ou JLS 4.10.2 :

Les supertypes directs du type nul sont tous les types de référence autres que le type nul lui-même.

[Je souligne.]

Selon le compilateur d'Eclipse Juno ce n'est pas :

true.toString();  // Cannot invoke toString() on the primitive type boolean
null.toString();  // Cannot invoke toString() on the primitive type null

Selon les JDK 1.7.0_07 javac c'est :

true.toString();  // error: boolean cannot be dereferenced
null.toString();  // error: <null> cannot be dereferenced

Où les crochets impliquent pour moi que null est d'un type autre qu'un type primitif. Et selon JLS 4.1 :

Il existe deux types de types dans le langage de programmation Java: les types primitifs et les types de référence.

Donc, si ce n'est pas l'un c'est l'autre.


Claudiu a écrit:

null est un peu laid.

Au contraire, null est magnifique. Que suggéreriez-vous comme valeur par défaut pour une variable de type référence à la place? Une combinaison de bits arbitraire? Bienvenue à accéder à la violation ou, pire encore, à l'enfer du pointeur!


Joachim Sauer a écrit:

null est un type et une valeur.

Il y a en fait trois éléments en conjonction avec null (voir aussi JLS 3.10.7 ):

  1. Le (sinon sans nom) type nul.
  2. Le null littéral.
  3. La valeur référence nulle. (Couramment abrégé comme valeur nulle ou simplement null.)

(1) Notez que, selon JLS 4.10.2 cité ci-dessus, le type nul utilise l'héritage multiple non seulement pour les interfaces mais aussi pour les classes. Ce que nous savons tous n'est pas possible pour nous, programmeurs d'applications.

(2) Le littéral nul pourrait être imaginé comme une variable définie comme:

JVM_global final null_type null = new null_type();

Notez également JLS 3.9 :

[...] alors que null peut sembler être un mot-clé, il s'agit techniquement du littéral nul.


Concernant null instanceof <anytype>:

Avec JLS 4.10.2 en tête ("le type nul est un sous-type de chaque type") null instanceof <anytype> Devrait être supposé s'évaluer en true, shouldn ' t-il? À première vue, oui, mais JLS 15.20.2 donne la réponse éclairée:

[...] le résultat de l'opérateur instanceof est vrai si la valeur de RelationalExpression n'est pas nul [...]. Sinon, le résultat est faux .

[Je souligne.]

Demandez-vous ce qui est le plus logique (du point de vue du programmeur d'application):

  • Donner false et ainsi indiquer qu'une expression de référence n'est pas d'un type qui nous est exposé, c'est-à-dire indiquer qu'elle ne fait référence à rien d'utile pour nous

  • ou en donnant true, nous informant ainsi que l'expression est évaluée à une référence spéciale, la référence nulle, référençant un "objet" nous ne savons pas s'il existe même et qui est du type spécial de type nul qui n'a pas de nom, ne nous est pas exposé mais via le littéral nul, est un sous-type de tout type comprenant l'héritage multiple et doit être ignoré de toute façon? Prenons également l'exemple le plus pratique:

     RedBullStratosBalloon balloon = null;
     boolean b = balloon instanceof Aircraft;  // True? There's not even an instance
                                               // which could be of type Aircraft.
    

Ce qui conduit également à:

Pourquoi instanceof n'est-il pas une bonne façon de dire quelque chose sur l'objectivité de null?

Cela s'appelle instanceof pas sameorsubtypeof. Cela signifie que nous comparons le type d'une instance avec un type, pas deux types. Maintenant null signifie: "Il n'y a pas d'instance" et s'il n'y a pas d'instance, il n'y a pas de type d'instance. Il est évident que ne rien comparer à quelque chose est censé conduire à false.

Ou dans un exemple "plus" du monde réel:

  • J'ai une image en taille réelle d'un Apple ( = type de référence) entre mes mains avec "Big Apple" ( = nom du type de référence ) écrit dessus.
  • Il y a une table ( = tas) devant moi.
  • S'il y a un Apple ( = instance) sur la table il y a un cordon ( = référence) qui lui est connecté .
  • Je tiens l'autre extrémité de ce cordon dans ma main ( = variable de référence).
  • Je trace le Apple le long du cordon et le compare avec ma photo ( = instanceof).
  • Si le Apple est de la même taille ou plus grand que l'image, l'écriture "Big Apple" s'applique à lui ( = true).
  • Si elle est plus petite, alors non ( = false).
  • S'il n'y a pas Apple sur la table et, par conséquent, aucun cordon n'existe ( = null) l'écriture ne s'applique pas non plus ( = faux). Parce que: non Apple une grosse pomme? Non, ce n'est pas le cas.


Comme le résume Michael: "null est spécial" en effet.

12
Gerold Broser

Non, ce n'est pas une instance d'une classe ni une classe. C'est une référence à rien.

Modifier : je n'ai pas lu les spécifications, donc ce qui précède peut ne pas être précis à 100%.

9
cherouvim

Comme expliqué dans le chapitre 4.1 Les types de types et de valeurs de la spécification de langage Java, null est un type qui en a un , la référence nulle (et est représentée par le littéral null):

Il existe également un type spécial null, le type de l'expression null, qui n'a pas de nom. Étant donné que le type nul n'a pas de nom, il est impossible de déclarer une variable du type nul ou de transtyper en type nul. La référence null est la seule valeur possible d'une expression de type null. La référence nulle peut toujours être convertie en n'importe quel type de référence. En pratique, le programmeur peut ignorer le type nul et prétendre simplement que null est simplement un littéral spécial qui peut être de n'importe quel type de référence.

Vous voudrez peut-être en savoir plus sur le Modèle d'objet nul (que je ne recommande pas) cependant. Voir C2 Wiki ou Wikipedia pour en savoir plus sur ce modèle.

5
Pascal Thivent

Non. Même si c'était le cas, c'est inutile car il n'a pas de méthode ni de champ.

5

Non, n'est pas un objet car null instanceof Object retournera toujours false également il n'y a qu'un seul null, pas un pour chaque classe.

4
userj29874319284

Selon le Java Spec ,

Il existe également un littéral null spécial qui peut être utilisé comme valeur pour tout type de référence. null peut être affecté à n'importe quelle variable, à l'exception des variables de types primitifs. Il n'y a pas grand-chose que vous puissiez faire avec une valeur nulle au-delà du test de sa présence. Par conséquent, null est souvent utilisé dans les programmes comme marqueur pour indiquer qu'un objet n'est pas disponible.

4
Peter Lawrey

Java gère les objets via des références. Null est une ventilation de OO-ness de Java, car il vous fait descendre en dessous du niveau OO. Non, ce n'est pas un objet, c'est la VALEUR d'une référence. Et cela n'a rien à voir avec l'objet paradigmes, mais concerne la plomberie de Java, qui permet aux objets.

4
Pavel Zaitsev

Null est une instance de Java.lang.Object? Non.

Est nul un objet? dépend de la définition de "is".

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

La première ligne indique que null peut être affecté au type Object, mais la deuxième ligne montrera que ce n'est certainement pas un Object et finira par aboutir à un Java.lang.NullPointerException

2
Matt Stephenson

Non, null n'est pas un objet. C'est un type de référence et sa valeur ne fait référence à aucun objet et il n'y a donc pas de représentation de null en mémoire.

1
SparkOn