Java双初始化
这些陈述在哪些方面有所不同?
- double dummy = 0;
- double dummy = 0.0;
- double dummy = 0.0d;
- 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,请参阅5.1.2扩展Java语言规范中的原始转换 。 请注意,这完全由编译器完成,它对生成的字节码没有任何影响。
对于其他人:
double dummy = 0.0; double dummy = 0.0d; double dummy = 0.0D;
这三个完全相同 – 0.0d
和0.0D
只是编写double
文字的三种不同方式。 请参阅JLS中的3.10.2浮点文字 。
最后3个应该是相同的。 右侧的文字已经是双重的。 当你有一个十进制文字时,’d’或’D’是隐式的。
第一个略有不同,因为0是一个int文字,它将被加宽为double。 我不知道在这种情况下是否会生成不同的字节代码; 无论如何,结果应该是相同的。
对于Java我不完全确切,在C中,如果你最后省略这个D会非常危险,因为它不会改变高位字节,这可能会影响你的变量就是你实际上没有放入的数字!
在Java中,我有一个非常大的问题,实例化BigDecimal – 新的BigDecimal(0)和新的bigDecimal(0L)不是一回事,如果你将代码从Java 1.4迁移到Java 1.5,你会感觉到它。 不知道为什么他们对此很草率,也许他们不得不这样做。