Null est-il un Object
en Java?
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".
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.
Absolument pas: null instanceof Object
renvoie faux.
Non, ce n'est pas un objet.
Null est le manque d'objet.
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 ):
null
littéral.(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:
Comme le résume Michael: "null est spécial" en effet.
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%.
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 quenull
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.
Non. Même si c'était le cas, c'est inutile car il n'a pas de méthode ni de champ.
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.
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.
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.
Null est une instance de Java.lang.Object
? Non.
Est nul un objet? dépend de la définition de "is".
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
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.