初期化されていないローカル変数で静的コンテンツにアクセスできないのはなぜですか?
質問
以下のコードを見てください。
class Foo{
public static int x = 1;
}
class Bar{
public static void main(String[] args) {
Foo foo;
System.out.println(foo.x); // Error: Variable 'foo' might not have been initialized
}
}
静的フィールド
x
を経由して
未初期化の
ローカル変数
Foo foo;
コード
foo.x
はコンパイルエラーを発生させます。
Variable 'foo' might not have been initialized
.
それは
見える
このエラーは理にかなっているように見えますが、これは
static
メンバにアクセスするために、JVMは実際には
を使用します。
その
値
のみで、その変数の
型
.
例えば
foo
を値
null
にアクセスできるようになります。
x
に問題なくアクセスできるようになります。
Foo foo = null;
System.out.println(foo.x); //compiles and at runtime prints 1!!!
このようなシナリオがうまくいくのは、コンパイラが
x
が静的であることを認識し
foo.x
のように書かれたものとして扱います。
Foo.x
(のように書かれているように見えます(少なくとも私は今までそう思っていました)。
ではなぜコンパイラは突然
foo
という値を持つ
を使うことはありません。
を全く使わないのですか?
免責事項: これは実際のアプリケーションで使用されるコードではありませんが、私はStack Overflowで答えを見つけることができなかったので、私はそれについて尋ねることにした興味深い現象です。
どのように解決するのですか?
もしフィールドが 静的 :
一次式が評価され、その結果は破棄されます。 . もし一次式の評価が突然終了した場合、フィールドアクセス式も同じ理由で突然終了します。
先ほどは、フィールドアクセスは
Primary.Identifier
.
このことから、一見すると
Primary
を使用していないように見えても、評価され、その結果は破棄されるため、初期化が必要であることがわかります。 これは、引用文にあるように、評価によってアクセスが停止した場合に違いが生じる可能性があります。
EDITです。
この例では、視覚的な例として
Primary
が評価され、その結果が破棄されることを示す短い例です。
class Foo {
public static int x = 1;
public static Foo dummyFoo() throws InterruptedException {
Thread.sleep(5000);
return null;
}
public static void main(String[] args) throws InterruptedException {
System.out.println(dummyFoo().x);
System.out.println(Foo.x);
}
}
ここでは
dummyFoo()
はまだ評価されています。
print
は5秒間の
Thread.sleep()
を返すにもかかわらず、常に
null
の値を返しますが、これは破棄されます。
式が評価されなかった場合
print
が即座に現れますが、これはクラス
Foo
を直接使って
x
で
Foo.x
.
注意
メソッド呼び出しもまた
Primary
で示される
§15.8 一次式
.
関連
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
ジャバアレイ
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] 静的変数が悪とされるのはなぜですか?
-
[解決済み] なぜJavaでは静的メソッドを抽象化できないのですか?
-
[解決済み] なぜJavaは静的メソッドのオーバーライドを認めないのですか?
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み] なぜJavaのmainメソッドは静的なのですか?
最新
-
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 実装 サイバーパンク風ボタン