这些语句有何不同之处?
1. double dummy = 0; 2. double dummy = 0.0; 3. double dummy = 0.0d; 4. double dummy = 0.0D;
1. double dummy = 0; 2. double dummy = 0.0; 3. double dummy = 0.0d; 4. double dummy = 0.0D;
尝试了一个简单的程序(同时使用0和100,以展示“特殊”常量和通用常量之间的区别),Sun Java 6编译器将对1和2输出相同的字节码(对于编译器而言,情况3和4与2相同)。
因此,例如:
double x = 100;
double y = 100.0;
编译后的结果为:
0: ldc2_w #2; //double 100.0d
3: dstore_1
4: ldc2_w #2; //double 100.0d
7: dstore_3
然而,在Java语言规范中,我没有看到任何内容保证此编译时常量表达式的扩展。对于像以下这样的情况,存在编译时收缩:
byte b = 100;
根据第5.2节的规定,但并不完全相同。也许比我更敏锐的人可以在那里找到保证...对于第一个问题:
double dummy = 0;
整数字面值0
通过扩大基本类型转换转换为double。请参见Java语言规范中的5.1.2 扩展基本类型转换。请注意,这完全是由编译器完成的,它不会对生成的字节码产生任何影响。
对于其他的:
double dummy = 0.0;
double dummy = 0.0d;
double dummy = 0.0D;
这三个是完全相同的 - 0.0
, 0.0d
, 和 0.0D
只是写一个 double
字面值的三种不同方式。请参考 JLS 中的3.10.2 浮点字面值。
0d
是什么意思? - J'edouble
字面量的另一种方式。 - Jesper