Подтвердить что ты не робот

Двойная инициализация Java

Чем отличаются эти утверждения?

  • double dummy = 0;
  • double dummy = 0.0;
  • double dummy = 0.0d;
  • double dummy = 0.0D;
4b9b3361

Ответ 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;

целочисленный литерал 0 преобразуется в двойное с расширением примитивного преобразования, см. 5.1.2 Расширение примитивного преобразования на языке Java Спецификация. Обратите внимание, что это делается полностью компилятором, это не влияет на созданный байт-код.

Для других:

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

Эти три точно такие же - 0.0, 0.0d и 0.0d - это всего лишь три разных способа записи литерала double. См. 3.10.2 Литералы с плавающей запятой в JLS.

Ответ 3

Последние 3 должны быть одинаковыми. Литерал с правой стороны уже двойной. "D" или "D" неявно, если у вас есть десятичный литерал.

Первый из них несколько отличается тем, что 0 - это int-буква, который будет расширен до двойника. Я не знаю, создает ли в этом случае другой байт-код или нет; результат все равно должен быть идентичным.

Ответ 4

для Java Я точно не знаю, в C это может быть действительно опасно, если вы опустите этот D в конце, так как он не изменит верхние байты, что может повлиять на то, что в вашей переменной лежит число, которое вы на самом деле не ставили в!

В Java у меня была действительно большая проблема с установкой BigDecimal - новый BigDecimal (0) и новый bigDecimal (0L) - это не то же самое, вы можете почувствовать это, если перенести свой код с Java 1.4 на Java 1.5. Не знаю, почему они были небрежны в этом, может быть, они должны были это сделать.