6

静的初期化子に、javac のバグである可能性があるものがあることに気付きました。変数に値を割り当てることはできるが、その値を読み取ることはできないというシナリオを作成しました。

以下に 2 つの例を示します。1 つ目は正常にコンパイルされ、2 つ目は tmp から値を読み取ろうとするとエラーが発生しますが、何らかの理由で tmp に値を代入することが許可されています。静的初期化子の後に tmp が宣言されているため、変数の読み取りも書き込みもできないかどうかは理解できましたが、そのうちの 1 つだけのエラーは意味がありません。

//Compiles Successfully:
public class Script
{
    public static Object tmp;
    static
    {
        tmp = new Object();
        System.out.println(tmp);
    }

}

//error only on the read but not the assignment
public class Script
{

    static
    {
        tmp = new Object();
        System.out.println(tmp);
    }
    public static Object tmp;
}

この点をさらに強調すると、これは正常にコンパイルされます。

public class Script
{

    static
    {
        tmp = new Object();
    }
    public static Object tmp;
}
4

1 に答える 1

3

これは仕様で定義されているようです(JLS 8.3.2.3を参照):

メンバーの宣言は、メンバーがクラスまたはインターフェイス C のインスタンス (それぞれ静的) フィールドであり、次のすべての条件が保持される場合にのみ、使用する前にテキストで表示する必要があります。

  • 使用は、C のインスタンス (それぞれ静的) 変数初期化子または C のインスタンス (それぞれ静的) 初期化子
    で発生します。

  • 使用法は割り当ての左側にありません。

  • 使い方は単純な名前です。

  • C は、使用法を囲む最も内側のクラスまたはインターフェイスです。

したがって、使用法が代入の左側にある場合、2 番目の使用法はもはや成立しないため、それは正当です。

于 2013-05-07T14:13:59.890 に答える