これらのステートメントはどのように異なっていますか?
単純なプログラム(「特別な」定数と一般的な定数の違いを示すために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 Language Specificationguaranteeing)このコンパイル時の定数式の拡張には何も表示されません。次のような場合には、コンパイル時のナローイングがあります。
byte b = 100;
セクション5.2 で指定されていますが、それはまったく同じものではありません。
私よりも鋭い目を持つ誰かがどこかで保証を見つけることができるかもしれません...
最初の場合:
double dummy = 0;
整数リテラル0
は、拡張プリミティブ変換でdoubleに変換されます。Java Language Specification。の 5.1.2拡張プリミティブ変換 を参照してください。これは完全にコンパイラーによって行われ、生成されるバイトコードには影響を与えません。
その他の場合:
double dummy = 0.0;
double dummy = 0.0d;
double dummy = 0.0D;
これら3つはまったく同じです-0.0
、0.0d
および0.0D
は、double
リテラルを記述する3つの異なる方法です。 JLSの 3.10.2浮動小数点リテラル を参照してください。
最後の3つは同一でなければなりません。右側のリテラルはすでにダブルです。 10進リテラルがある場合、「d」または「D」は暗黙的です。
最初のものは、0がintリテラルであり、doubleに拡張されるという点でわずかに異なります。この場合、異なるバイトコードが生成されるかどうかはわかりません。とにかく結果は同じになるはずです。