Java 双初始化

2022-09-01 06:05:05

这些说法在哪些方面有所不同?

  1. 双假人 = 0;
  2. 双假人 = 0.0;
  3. 双假人 = 0.0d;
  4. 双假人 = 0.0D;

答案 1

在尝试了一个简单的程序(同时使用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节所述,但这不是一回事。

也许比我眼神更敏锐的人可以在某个地方找到保证......


答案 2

对于第一个:

double dummy = 0;

整数文本通过加宽基元转换转换为双精度值,请参阅 Java 语言规范中的 5.1.2 加宽基元转换。请注意,这完全由编译器完成,它对生成的字节码没有任何影响。0

对于其他的:

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

这三种完全相同 - ,只是写字面的三种不同方式。请参见 3.10.2 JLS 中的浮点文字0.00.0d0.0Ddouble