[英]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.