静的修飾子と最終修飾子によるJavaの奇妙な動作 [重複] [重複
2023-08-20 19:40:23
質問
私たちのチームでは、いくつかの奇妙な挙動を発見しました。
static
と
final
の修飾子があります。これはテストクラスです。
public class Test {
public static final Test me = new Test();
public static final Integer I = 4;
public static final String S = "abc";
public Test() {
System.out.println(I);
System.out.println(S);
}
public static Test getInstance() { return me; }
public static void main(String[] args) {
Test.getInstance();
}
}
を実行すると
main
というメソッドを実行すると、結果が得られます。
null
abc
と書かれていれば理解できるのですが
null
の値は、静的なクラスメンバのコードは上から下へ実行されるので、両方の回で書いても理解できます。
なぜこのような動作になるのか、どなたか説明していただけませんか?
どのように解決するのですか?
プログラムを実行したときの手順です。
-
実行前
main
を実行することができます。Test
クラスは、出現順に静的イニシャライザーを実行して初期化する必要があります。 -
を初期化するために
me
フィールドを初期化するためにnew Test()
. -
の値を表示します。
I
. フィールドの型がInteger
であるため、コンパイル時の定数のように見えるもの4
は計算された値 (Integer.valueOf(4)
). このフィールドのイニシャライザはまだ実行されておらず、初期値であるnull
. -
の値を表示します。
S
. コンパイル時の定数で初期化されているので、この値は参照先で焼き付けられ、印刷するabc
. -
new Test()
のイニシャライザは完了です。I
のイニシャライザーが実行されます。
教訓:もしイーガーリー初期化された静的シングルトンに依存しているなら、シングルトン宣言を最後の静的フィールド宣言として配置するか、他のすべての静的宣言の後に発生する静的イニシャライザーブロックに頼りましょう。そうすることで、シングルトンの構築コードに対して、クラスが完全に初期化されているように見えるようになります。
関連
-
配列定数は初期化子でのみ使用可能です。
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] Javaにおける静的クラス
-
[解決済み] Javaにおける "final class "の意味とは?
-
[解決済み] Javaの "final "キーワードはどのように機能するのでしょうか?(オブジェクトを修正することは可能です。)
-
[解決済み] Javaリフレクションを用いた静的なプライベートfinalフィールドの変更
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
プロジェクトの依存関係を解決できない。
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
eclipse にリソースリーク:'in' が閉じない
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
java 365*1000*60*60*24 計算問題
-
テストが空であるかどうかを判断するためのオプションの処理
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.