次のコードでreadSide()
はSIDE
を参照し、別の静的変数を初期化するために呼び出されると、SIDE
の宣言で割り当てられた値ではなく、ゼロの値が得られます。Javaはコンパイラエラーやランタイムエラーが発生していない初期化されていない最終静的変数をいつ、そしていつ読み込むのですか?
import java.util.Random;
public class StaticTest {
private final static float SIDE_FROM_METHOD = readSide();
private final static float SIDE = 100.0f * new Random().nextFloat();
private static float readSide() {
System.out.println("In readSide(): SIDE=" + SIDE);
return SIDE;
}
public static void main(String[] args) {
System.out.println("In main(): SIDE_FROM_METHOD=" + SIDE_FROM_METHOD);
System.out.println("In main(): SIDE=" + SIDE);
System.out.println("In main(): readSide() return=" + readSide());
}
}
サンプル出力:SIDE
もののだから
In readSide(): SIDE=0.0
In main(): SIDE_FROM_METHOD=0.0
In main(): SIDE=85.84305
In readSide(): SIDE=85.84305
In main(): readSide() return=85.84305
が一定であると仮定され、Javaは、それが中で行われる例外をスローするか、その初期化順序を保証いずれかではなく、実行時に値を変更することができ依存関係の順序。
「最終的な静的」オブジェクトを定義する順序は問題のある動作の原因だと思いますが、そのように動作する代わりに例外が発生するのはなぜですか?
SIDE
はリテラルではなく、計算された値に初期化されている場合:その後、出力は100.0
全体にある...
private final static float SIDE=100.0f;
。
In readSide(): SIDE=100.0
In main(): SIDE_FROM_METHOD=100.0
In main(): SIDE=100.0
In readSide(): SIDE=100.0
In main(): readSide() return=100.0
なぜこれが違いますか?
奇妙な動作の意味を含めることはできますか? – corriganjc
なぜそれが間違っていますか? –
@corriganjcサンプル出力が質問に追加されました。 – user2999069