2013-12-18 6 views
8

私は次のコードnullを返す静的メソッドから静的変数を呼び出すのがなぜNPEをスローしないのですか?

public class Test { 
    static String mountain = "Everest"; 

    static Test favorite() { 
     System.out.print("Mount "); 
     return null; 
    } 

    public static void main(String[] args) { 
     System.out.println(favorite().mountain); 
    } 
} 

を持っている私はそれがNPEを上げるだろうと思ったけど、誰もが明確にすることができ、それは、出力としてMount Everestを与えていますか?

+0

C#についての素晴らしいことは、クラスではなくインスタンスから '山'にアクセスしているのでコンパイルできないということです(ここで火炎を始めるのではなく、ただコメントしてください) –

答えて

4

オブジェクト参照の静的メンバーにアクセスできるようになりました。その場合、メンバーはタイプ(その値ではなく)で解決されます。

フィールドは非空白最後のフィールドである場合

Java Language Specificationが、これはstaticメンバー

のフィールドへのアクセスについて述べている、、結果はクラスまたはインタフェースの指定されたクラス変数の値 ですプライマリ式のタイプが です。

フィールドは最終ない、またはコンストラクタで が発生ブランク最終フィールドアクセスである場合には、は、結果は、クラス内の変数、即ち、 指定されたクラスの変数でありますプライマリ 式のタイプです。

のでプライマリ、インスタンスは、重要ではありません。

+0

私にこのことを理解させてくれてありがとう... お気に入り(); テストt = null。 System.out.println(t.mountain); // Ok – MaheshVarma

+0

@Maheshよろしくお願いします。あなたはJavaでこのような状況に遭遇するかもしれません。彼らはすぐにはっきりしないかもしれませんが、非常によく文書化されています。 –

+0

ご参考までに空白の最終フィールドと空白でない最終フィールドは何ですか? – MaheshVarma

3

クラスのインスタンスでstaticメンバーにアクセスすると、Javaコンパイラは変数のランタイム値(およびクラス)を完全に無視し、宣言されたクラスに属するメンバーを使用します。

public class SubTest extends Test { 
    static String mountain = "Kilimanjaro"; 
} 

... 
Test foo = new SubTest(); 
System.out.println(foo.mountain); 

あなたはまだTestクラス上の値を取得します:あなたはこのようなコードを持っていたとしても、

favorite(); 
System.out.println(Test.mountain); 

:この場合、あなたのコードは同等です。

+0

今は非常に明確です。ありがとう – MaheshVarma

0

​​は、Test型を返す静的メソッドです。次に、このクラスの静的変数(mountain)を使用します。これは、このクラスのインスタンスを決して使用しない(使用する必要がない)ので、nullポインタ例外が存在しないように動作します。

関連する問題