簡體   English   中英

為什么不調用從返回null的靜態方法鏈接的靜態變量拋出NPE?

[英]Why doesn't calling a static variable chained from a static method that returns null throw a 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作為輸出可以任何人澄清?

恰好可以訪問對象引用上的靜態成員。 在這種情況下,根據引用的類型而不是其值來解析成員。

Java語言規范說明了static成員的字段訪問

如果該字段是非空的final字段, 則結果是類或接口中指定的類變量的值,該類是Primary表達式的類型。

如果該字段不是final ,或者是空白final並且字段訪問發生在構造函數中, 那么結果是一個變量 ,即類中指定的類變量,它是Primary表達式的類型。

因此, 主要實例並不重要。

當您訪問類實例上的static成員時,Java編譯器會完全忽略變量的運行時值(甚至類)並使用屬於聲明的類的成員。 在這種情況下,您的代碼相當於:

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

即使你有這樣的代碼:

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

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

你仍然可以獲得Test類的價值。

favorite()是一個返回Test類型的靜態方法。 然后使用此類( mountain )的靜態變量。 這一切都可以正常工作,因為您從不使用(並且不需要使用)此類的實例,因此不會出現空指針異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM