Java双初始化

这些陈述在哪些方面有所不同?

  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,请参阅5.1.2扩展Java语言规范中的原始转换 。 请注意,这完全由编译器完成,它对生成的字节码没有任何影响。

对于其他人:

 double dummy = 0.0; double dummy = 0.0d; double dummy = 0.0D; 

这三个完全相同 – 0.0d0.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,你会感觉到它。 不知道为什么他们对此很草率,也许他们不得不这样做。