119

staticJavaのメンバー(staticフィールドまたはstaticメソッド)は、このクラスのオブジェクトではなく、それぞれのクラスに関連付けられています。次のコードは、参照の静的フィールドにアクセスしようとしますnull

public class Main
{
    private static final int value = 10;

    public Main getNull()
    {
        return null;
    }

    public static void main(String[] args)
    {
        Main main=new Main();
        System.out.println("value = "+main.getNull().value);
    }
}

main.getNull()を返しますが、null動作して表示されますvalue = 10。このコードはどのように機能しますか?

4

5 に答える 5

93

その動作は、Java言語仕様で指定されています。

null参照を使用して、例外を発生させずにクラス(静的)変数にアクセスできます。

より詳細には、次のように機能するような静的フィールド評価Primary.staticField(私の強調)-あなたの場合、Primary = main.getNull()

  • 一次式が評価され、結果は破棄されます。[...]
  • フィールドが空白以外の最終フィールドである場合、結果は、プライマリ式のタイプであるクラスまたはインターフェイスで指定されたクラス変数の値になります。[...]
于 2012-07-20T13:06:18.130 に答える
19

なぜなら、あなたが言ったように、静的フィールドはインスタンスに関連付けられていないからです。

インスタンス参照から静的フィールドにアクセスする機能(実行しているように)は、単なる構文上の糖衣であり、追加の意味はありません。
コードは次のようにコンパイルされます

main.getNull(); 
Main.value
于 2012-07-20T13:05:32.263 に答える
3
  1. クラス名を持つメンバーへのアクセスは合法ですが、オブジェクト参照変数を使用しstaticてメンバーにアクセスできないことは書かれていません。staticだからここで動作します。

  2. nullオブジェクト参照変数は、コンパイル時または実行時に例外をスローせずにクラス変数にアクセスできますstatic

于 2012-07-20T13:10:14.480 に答える
3

コンパイル時にオブジェクトを使用して静的変数またはメソッドにアクセスすると、クラス名に変換されます。例えば:

Main main = null;
System.out.println(main.value);

コンパイル時に変換されるため、静的変数値の値を出力します。

System.out.println(Main.value);

証拠:

逆コンパイラをダウンロードし、.classファイルを.javaファイルに逆コンパイルすると、すべての静的メソッドまたは変数参照オブジェクト名が自動的にクラス名に置き換えられることがわかります。

于 2012-12-20T09:52:52.010 に答える
2

静的変数とメソッドは常にクラスに属します。したがって、オブジェクトを作成するときは常に、非静的変数とメソッドのみがオブジェクトと一緒にヒープに移動しますが、静的はクラスのあるメソッド領域に存在します。そのため、静的変数またはメソッドにアクセスしようとすると、クラス名ドット変数またはメソッド名に変換されます。

詳細については、以下のリンクを参照してください。

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

于 2012-12-26T14:39:48.680 に答える