En quoi ces déclarations sont-elles différentes?
Après avoir essayé un programme simple (en utilisant à la fois 0 et 100, pour montrer la différence entre les constantes "spéciales" et les constantes générales), le compilateur Sun Java 6 affichera le même bytecode pour 1 et 2 ( les cas 3 et 4 sont identiques à 2 pour le compilateur).
Ainsi, par exemple:
double x = 100;
double y = 100.0;
se compile pour:
0: ldc2_w #2; //double 100.0d
3: dstore_1
4: ldc2_w #2; //double 100.0d
7: dstore_3
Cependant, je ne vois rien dans la Java garantissant cet élargissement au moment de la compilation des expressions constantes. Il y a un rétrécissement à la compilation pour des cas comme:
byte b = 100;
comme spécifié dans section 5.2 , mais ce n'est pas tout à fait la même chose.
Peut-être que quelqu'un avec des yeux plus vifs que moi peut y trouver une garantie quelque part ...
Pour le premier:
double dummy = 0;
le littéral entier 0
est converti en double avec une conversion primitive d'élargissement, voir 5.1.2 Conversion d'élargissement primitive dans la spécification de langage Java. Notez que cela est entièrement effectué par le compilateur, il n'a aucun impact sur le bytecode produit.
Pour les autres:
double dummy = 0.0;
double dummy = 0.0d;
double dummy = 0.0D;
Ces trois sont exactement les mêmes - 0.0
, 0.0d
et 0.0D
ne sont que trois façons différentes d'écrire un littéral double
. Voir .10.2 Littéraux à virgule flottante dans le JLS.
Les 3 derniers doivent être identiques. Le littéral du côté droit est déjà un double. Le "d" ou le "D" est implicite lorsque vous avez un littéral décimal.
Le premier est légèrement différent en ce que 0 est un entier littéral, qui sera élargi au double. Je ne sais pas si cela produit même du code d'octets différent dans ce cas ou non; le résultat devrait de toute façon être identique.