Qu'est-ce que null
?
Est-ce que null
est une instance de quelque chose?
À quel ensemble appartient null
?
Comment est-il représenté dans la mémoire?
Est-ce que null est une instance de quelque chose?
Non, il n'y a pas de type qui null
soit un instanceof
.
instanceof
_RelationalExpression: RelationalExpression instanceof ReferenceType
_Au moment de l'exécution, le résultat de l'opérateur
instanceof
esttrue
si la valeur de l'expression relationnelle n'est pasnull
et que la référence peut être Transformez en type ReferenceType sans déclencher uneClassCastException
. Sinon, le résultat estfalse
.
Cela signifie que pour tout type E
et R
, pour tout _E o
_, où _o == null
_, _o instanceof R
_ est toujours false
.
À quel ensemble "null" appartient-il?
Il existe également un type spécial null , le type de l'expression
null
, qui n'a pas de nom. Comme le type null n’a pas de nom, il est impossible de déclarer une variable du type null ou d’être converti en null type. La référencenull
est la seule valeur possible d'une expression de type null . La référencenull
peut toujours être convertie en n'importe quel type de référence. En pratique, le programmeur peut ignorer le type null et prétendre quenull
est simplement un littéral spécial pouvant être de n'importe quel type de référence.
Qu'est-ce qui est nul?
Comme le dit la citation JLS ci-dessus, dans la pratique, vous pouvez simplement prétendre qu'il s'agit "simplement d'un littéral spécial pouvant être de n'importe quel type de référence".
En Java, _null == null
_ (ce n'est pas toujours le cas dans d'autres langues). Notez également que, par contrat, il possède également cette propriété spéciale (de Java.lang.Object
):
public boolean equals(Object obj)
Pour toute valeur de référence non -
null
x
,x.equals(null)
doit _return false
_.
C'est également la valeur par défaut (pour les variables qui en ont) pour tous les types de référence:
- Chaque variable de classe, variable d'instance ou composant de tableau est initialisé avec une valeur par défaut lors de sa création:
- Pour tous les types de référence, la valeur par défaut est
null
.
Comment cela est utilisé varie. Vous pouvez l'utiliser pour activer ce que l'on appelle l'initialisation lente des champs, où un champ aurait sa valeur initiale de null
jusqu'à ce qu'il soit réellement utilisé, où il est remplacé par le valeur "réelle" (dont le calcul peut coûter cher).
Il y a aussi d'autres utilisations. Prenons un exemple réel de Java.lang.System
:
public static Console console()
Renvoie : La console système, le cas échéant, sinon
null
.
Ceci est un motif d'utilisation très courant: null
est utilisé pour dénoter la non-existence d'un objet.
Voici un autre exemple d'utilisation, cette fois de Java.io.BufferedReader
:
public String readLine() throws IOException
Retourne : Un
String
contenant le contenu de la ligne, sans caractères de fin de ligne, ounull
si la fin du flux a été atteint.
Donc, ici, readLine()
renverrait _instanceof String
_ pour chaque ligne, jusqu’à ce qu’elle renvoie finalement un null
pour indiquer la fin. Cela vous permet de traiter chaque ligne comme suit:
_String line;
while ((line = reader.readLine()) != null) {
process(line);
}
_
On peut concevoir l'API de sorte que la condition de terminaison ne dépende pas de readLine()
renvoyant null
, mais on peut voir que cette conception présente l'avantage de rendre les choses concises. Notez qu'il n'y a pas de problème avec les lignes vides, car une ligne vide _"" != null
_.
Prenons un autre exemple, cette fois de Java.util.Map<K,V>
:
V get(Object key)
Renvoie la valeur à laquelle la clé spécifiée est mappée ou
null
si cette mappe ne contient aucun mappage pour la clé.Si cette carte autorise les valeurs
null
, une valeur renvoyée denull
n'indique pas nécessairement que la carte ne contient aucune correspondance pour la clé; il est également possible que la carte mappe explicitement la clé surnull
. L'opérationcontainsKey
peut être utilisée pour distinguer ces deux cas.
Nous commençons à voir comment utiliser null
peut compliquer les choses. La première instruction dit que si la clé n'est pas mappée, null
est renvoyé. La deuxième instruction dit que même si la clé est mappée, null
peut également être renvoyé.
En revanche, Java.util.Hashtable
simplifie les choses en ne permettant pas les clés null
et les valeurs; Sa V get(Object key)
, si renvoie null
, signifie sans ambiguïté que la clé n'est pas mappée.
Vous pouvez lire le reste des API et trouver où et comment null
est utilisé. N'oubliez pas qu'ils ne sont pas toujours les exemples de bonne pratique .
De manière générale, null
sont utilisés comme valeur spéciale pour signifier:
Comment est-il représenté dans la mémoire?
En Java? Aucune de vos préoccupations. Et c'est mieux gardé comme ça.
null
est une bonne chose?C'est maintenant subjectif à la limite. Certaines personnes disent que null
provoque de nombreuses erreurs de programmation qui auraient pu être évitées. Certains disent que dans un langage qui intercepte NullPointerException
comme Java, il est bon de l'utiliser parce que vous échouerez rapidement en cas d'erreur de programmation. Certaines personnes évitent null
en utilisant motif d'objet nul , etc.
Il s’agit d’un vaste sujet en lui-même, il est donc préférable d’en débattre en tant que réponse à une autre question.
Je terminerai par une citation de l'inventeur de null
lui-même, C.A.R Hoare (de la célébrité quicksort):
Je l'appelle mon erreur d'un milliard de dollars. C'était l'invention de la référence
null
en 1965. À l'époque, je concevais le premier système de types complet pour les références dans un langage orienté objet (ALGOL W). Mon objectif était de veiller à ce que toute utilisation des références soit absolument sûre, avec une vérification automatique par le compilateur. Mais je ne pouvais pas résister à la tentation de mettre une référencenull
, tout simplement parce que c'était si facile à mettre en œuvre. Cela a entraîné d'innombrables erreurs, vulnérabilités et pannes système, qui ont probablement causé des millions de dollars de douleur et de dommages au cours des quarante dernières années.
Le vidéo de cette présentation va plus loin; c'est une montre recommandée.
Est-ce que null est une instance de quelque chose?
C'est pourquoi null instanceof X
retournera false
pour toutes les classes X
. (Ne vous laissez pas berner par le fait que vous pouvez affecter null
à une variable dont le type est un type d'objet. À proprement parler, l'affectation implique une conversion de type implicite; voir ci-dessous.)
À quel ensemble "null" appartient-il?
C'est le seul et unique membre du type null, le type null étant défini comme suit:
"Il existe également un type null spécial, le type de l'expression null, qui n'a pas de nom. Comme le type null n'a pas de nom, il est impossible de déclarer une variable du type null ou Pour convertir le type null. La référence null est la seule valeur possible d'une expression de type null. La référence null peut toujours être convertie en n'importe quel type de référence. En pratique, le programmeur peut ignorer le type null et prétendre que null est simplement un littéral spécial pouvant être de n'importe quel type de référence. "JLS 4.1
Qu'est-ce qui est nul?
Voir au dessus. Dans certains contextes, null
est utilisé pour désigner "pas d'objet", "inconnu" ou "indisponible", mais ces significations sont spécifiques à l'application.
Comment est-il représenté dans la mémoire?
Cela dépend de la mise en œuvre et vous ne pourrez pas voir la représentation de null
dans un programme pur Java. (Mais null
est représenté sous la forme d'une adresse/pointeur machine zéro dans la plupart sinon la totalité des implémentations Java.)
Qu'est-ce qui est nul?
Ce n'est rien.
Est-ce que null est une instance de quelque chose?
Non, car ce n'est rien. Cela ne peut être l'instance d'aucune chose.
À quel ensemble appartient null?
Pas de set
Comment est-il représenté dans la mémoire?
Si certains points de référence, comme:
Object o=new Object();
Dans la mémoire de tas, de l’espace attribué au nouvel objet créé. Et o pointera vers cet espace assigné en mémoire.
Maintenant o=null;
Cela signifie maintenant que o ne pointera pas sur cet espace mémoire d'objet.
Non, ce n'est l'instance de rien, instance de sera toujours faux.
Le mot clé null est un littéral qui représente une référence null qui ne fait référence à aucun objet . null est la valeur par défaut des variables de type référence.
Aussi peut-être jeter un oeil à
Null en Java (tm)
En C et C++, "NULL" est une constante définie dans un fichier d'en-tête, avec une valeur telle que:
0
ou:
0L
ou:
((void*)0)
en fonction des options du compilateur et du modèle de mémoire. NULL ne fait pas, à proprement parler, partie de C/C++.
En Java (tm), "null" n'est pas un mot clé, mais un littéral spécial du type null. Il peut être converti en n'importe quel type de référence, mais pas en n'importe quel type primitif tel que int ou boolean. Le littéral nul n'a pas nécessairement la valeur zéro. Et il est impossible de transtyper vers le type null ou de déclarer une variable de ce type.
Null n'est une instance d'aucune classe.
Cependant, vous pouvez assigner null à des variables de n'importe quel type (objet ou tableau):
// this is false
boolean nope = (null instanceof String);
// but you can still use it as a String
String x = null;
"abc".startsWith(null);
Représentation du bytecode
La version null
de Java prend en charge directement la machine virtuelle Java: trois instructions sont utilisées pour la mettre en œuvre:
aconst_null
: par exemple définir une variable sur null
comme dans Object o = null;
ifnull
et ifnonnull
: par exemple. comparer un objet à null
comme dans if (o == null)
Le chapitre 6 "Le Java Jeu d'instructions de la machine virtuelle" mentionne ensuite les effets de null
sur d'autres instructions: il lance un NullPointerException
pour beaucoup d'entre elles.
2.4. "Types et valeurs de référence" mentionne également null
en termes génériques:
Une valeur de référence peut également être la référence null spéciale, une référence à aucun objet, qui sera désignée ici par null. La référence null n'a initialement aucun type d'exécution, mais peut être transtypé en n'importe quel type. La valeur par défaut d'un type de référence est null.
null
est une valeur spéciale, ce n'est pas une instance de rien. Pour des raisons évidentes, cela ne peut être instanceof
rien.
null
est une valeur spéciale qui n'est une instance d'aucune classe. Ceci est illustré par le programme suivant:
public class X {
void f(Object o)
{
System.out.println(o instanceof String); // Output is "false"
}
public static void main(String[] args) {
new X().f(null);
}
}
null dans Java est similaire à/similaire à nullptr en C++.
Programme en C++:
class Point
{
private:
int x;
int y;
public:
Point(int ix, int iy)
{
x = ix;
y = iy;
}
void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
Point* p = new Point(3,5);
if (p != nullptr)
{
p->print();
p = nullptr;
}
else
{
std::cout << "p is null" << std::endl;
}
return 0;
}
Même programme en Java:
public class Point {
private int x;
private int y;
public Point(int ix, int iy) {
x = ix;
y = iy;
}
public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
public static void main(String[] args) {
Point p = new Point(3,5);
if (p != null)
{
p.print();
p = null;
}
else
{
System.out.println("p is null");
}
}
}
Maintenant, comprenez-vous à partir des codes ci-dessus ce qui est nul en Java? Si non, je vous recommande d'apprendre des pointeurs en C/C++ et vous comprendrez.
Notez qu'en C, contrairement à C++, nullptr est indéfini, mais NULL est utilisé à la place, ce qui peut également être utilisé en C++ aussi, mais en C++, nullptr est préférable à NULL, car NULL en C est toujours associé aux pointeurs. Ainsi, en C++, le suffixe "ptr" a été ajouté à la fin du mot. De plus, toutes les lettres sont maintenant en minuscules, mais cela est moins important.
Dans Java chaque variable de classe de type non primitive est toujours une référence à un objet de ce type ou héritée et null est une référence d'objet de classe null, mais pas un pointeur null, car dans Java, il y a "pointeur" n'existe pas, mais les références aux objets de classe sont utilisées, et null dans Java est lié aux références d'objet de classe, vous pouvez donc également l'appeler "nullref" ou "nullrefobj", mais c'est long, appelez-le simplement "null".
En C++, vous pouvez utiliser des pointeurs et la valeur nullptr pour facultatif membres/variables, c'est-à-dire membre/variable qui n'a pas de valeur et s'il n'a pas de valeur, il est égal à nullptr, alors comment null dans Java peut être utilisé par exemple.
Il existe deux grandes catégories de types en Java: primitive et référence. Variables déclarées d'une valeur de magasin de type primitif; les variables déclarées d'un type de référence stockent des références.
String x = null;
Dans ce cas, l'instruction d'initialisation déclare une variable "x". “X” stocke la référence de chaîne. C'est null ici. Tout d'abord, null n'est pas une instance d'objet valide, donc aucune mémoire ne lui est allouée. C'est simplement une valeur qui indique que la référence de l'objet ne fait pas référence à un objet.
Réponse courte et précise qui répond formellement à toutes vos questions de JLS:
3.10.7. Le littéral nul
Le type null a une valeur, la référence null, représentée par le littéral null null, qui est formé à partir de ASCII caractères.
Un littéral nul est toujours du type nul.
Seule une référence de type affectée à null est allouée. Vous n'attribuez aucune valeur (objet) à la référence. Cette allocation est spécifique à la machine virtuelle Java: quelle sera la quantité de référence et dans quelle zone de mémoire elle sera allouée.
Une façon intéressante de voir null dans Java est, à mon avis, de le voir comme quelque chose qui NE dénote PAS une absence d'informations, mais simplement comme une valeur littérale pouvant être affectée à une référence de n'importe quel type. Si vous y réfléchissez si cela dénotait une absence d'information, alors pour que a1 == a2 soit vrai, cela n'a pas de sens (au cas où une valeur nulle leur serait assignée), car ils pourraient vraiment pointer vers UN objet (nous Je ne sais pas sur quels objets ils doivent pointer) ... Au fait, null == null renvoie true en Java. Si Java par exemple serait comme SQL: 1999 alors null == null renverrait unknown (une valeur booléenne dans SQL: 1999 peut prendre trois valeurs: true, false et unknown mais dans la pratique, unknown est implémenté comme null dans les systèmes réels) ... http://en.wikipedia.org/wiki/SQL