為什麼在空物件參考上呼叫靜態方法不會拋出 NullPointerException?
在 Java 中,通常理解為呼叫方法空物件參考會觸發 NullPointerException。但是,當對空引用呼叫靜態方法時,不會引發此異常。讓我們研究一下原因。
靜態方法定義和存取
靜態方法與類別關聯,而不是與特定實例關聯。可以直接使用類別名稱調用,無需物件引用。
意外行為
下面的範例程式碼說明了意外行為:
<code class="java">public class Why { public static void test() { System.out.println("Passed"); } public static void main(String[] args) { Why NULL = null; NULL.test(); // DOES NOT Throw NullPointerException } }</code>
根本原因
根本原因理解這段程式碼運作原理的關鍵在於靜態成員存取的概念。靜態成員(包括方法)屬於類型,不需要存取物件實例。
靜態方法的正確呼叫<code class="java">Why.test(); // Correct way to invoke static method</code>
靜態方法應直接呼叫使用類別名,如下所示:
透過物件引用進行非靜態存取雖然Java 允許透過物件引用存取靜態成員,但這種做法強烈灰心。它可能會導致混亂,因為它意味著存取實例成員,這是不正確的。
物件引用存取的意義物件的特定執行時間類型(如果存在)無關緊要,這與實例成員存取不同。
相關問題理解這個概念也說明了為什麼Java 禁止重寫靜態方法以及為什麼透過以下方式呼叫靜態方法對於Java 編譯器來說,實例不是錯誤。以上是為什麼對空物件參考呼叫靜態方法不會引發 NullPointerException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!