Java双初始化

时间:2009-09-18 08:56:37

标签: java double declaration

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

  1. double dummy = 0;
  2. double dummy = 0.0;
  3. double dummy = 0.0d;
  4. double dummy = 0.0D;

4 个答案:

答案 0 :(得分:23)

尝试了一个简单的程序(同时使用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;

section 5.2中指定,但这并不完全相同。

也许眼睛比我更敏锐的人可以在某处找到保证...

答案 1 :(得分:14)

第一个:

double dummy = 0;

整数文字0通过扩展原语转换转换为double,请参阅Java语言规范中的5.1.2 Widening Primitive Conversion。请注意,这完全由编译器完成,它对生成的字节码没有任何影响。

对于其他人:

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

这三个完全相同 - 0.00.0d0.0D只是编写double字面的三种不同方式。请参阅JLS中的3.10.2 Floating-Point Literals

答案 2 :(得分:3)

最后3个应该是相同的。右侧的文字已经是双重的。当你有一个十进制文字时,'d'或'D'是隐含的。

第一个略有不同,因为0是一个int文字,它将被加宽为double。我不知道在这种情况下是否会产生不同的字节代码;无论如何,结果应该是相同的。

答案 3 :(得分:-5)

for Java我不确切知道,在C中,如果你最后省略这个D会非常危险,因为它不会改变高位字节,这可能会影响你的变量就是你实际上没有放入的数字在!

在Java中,我有一个非常大的问题,即实例化BigDecimal - 新的BigDecimal(0)和新的bigDecimal(0L)不是一回事,如果你将代码从Java 1.4迁移到Java 1.5,你会感觉到它。不知道为什么他们对此很草率,也许他们不得不这样做。