6

宣言クラスを修飾子として (静的な方法で) 使用して、対応する静的初期化子から static final フィールドにアクセスできないのはなぜですか?

最初は、これは Eclipse のバグだと思いました。

エクリプスのバグ?

また、静的初期化子は私の日常業務ではないため、知識が不足していました。しかし、見よ、これはクラス修飾子なしで期待どおりに機能します。

知識不足?

テスト シリーズを完了するために、bash で試してみました。

くそ!

同じ結果を引き起こします。

これは私を最後の質問に導きます:

静的初期化ブロックから静的最終フィールドにアクセスするときにクラス修飾子を禁止する理由はありますか? 宣言クラスが以前に初期化されていなかったためですか?

4

2 に答える 2

5

実際には、静的初期化子から静的フィールドを初期化できます。

しかし、私は(よくわかりませんが)別の問題を抱えていると思います。ここでの問題は、(コンパイラによると) finalフィールドを割り当てようとしていることです。しかし、あなたの本当の意図はそれを割り当てることではありません..あなたはそれを初期化しようとしています. しかし、コンパイラはこれを取得しません。

コンパイラのようなものを呼び出すとTest.I、以前に初期化されている可能性のある静的変数を変更しようとしていると見なされます(つまり、静的初期化子から)。コンパイラは、変数を実際に初期化していることを確認するほど賢くはありませんTest。クラスから静的変数を割り当てていると解釈しているだけですFoo

ただし、クラス修飾子なしで呼び出すと、コンパイラは、静的初期化子で独自の静的変数を変更しようとしていることを認識しているため、操作は最終フィールドに対して安全です。

どうか、私が十分に明確であることを願っています。この動作については確信が持てないことに注意してください。

于 2014-08-13T11:35:00.590 に答える
1

初期化ブロックで最終変数を初期化するには、変数の単純な名前を使用する必要があります。つまり、修飾子なしで変数名だけです。

以下のようにJava言語仕様に記載されています

「同様に、すべての空白の最終変数は、多くても 1 回代入する必要があります。代入が発生したときは、確実に未代入でなければなりません。このような代入は、変数の単純名またはその単純名が修飾されている場合にのみ発生するように定義されています。これにより、代入演算子の左側で発生します. Java コンパイラは、特定の保守的なフロー分析を実行して、空白の最終変数への代入ごとに、その変数が代入前に確実に未代入であることを確認する必要があります。コンパイル時エラーが発生する必要があります。」

于 2014-08-13T12:02:45.907 に答える