先看一個示例,讀者可先自行閱讀判斷輸出結果:
 public class TestClass {
private static void testMethod(){
System.out.println("testMethod");
}
public static void main(String[] args) {
((TestClass)null).testMethod();
}
}
 上述事例會正確輸出:testMethod
分析:首先應該明白的是此處是針對類對方法的呼叫,而不是物件對方法的呼叫;
其次,testMethod方法是 statici靜態方法,直接使用"類方法"即可,因為靜態方法使用不依賴物件是否被建立。null可以被強制型別轉換成任意型別(不是任意型別物件),於是可以通過它來執行靜態方法;
最後,非靜態方法用"物件 . 方法"的方式呼叫,必須依賴物件被建立後才能使用,若將testmethod()方法前的 static去掉,則會報空指標異常。此處也驗證了上面的觀點。當然,不管是否是靜態方法,都是已經存在的,只是訪問方式不同 
 ------------------------------------------------------------------------
深入理解
一、null是代表不確定的物件
    Java中,null是一個關鍵字,用來標識一個不確定的物件。因此可以將null賦給引用型別變數,但不可以將null賦值給基本型別変量。比如:int a=null; 是錯誤的;而Ojbect o=null是正確的。在Java中,變數的適用都遵循一個原則,先定義,並且初始化後,才可以使用。我們不能int a 後,不給a指定值,就去列印a的值。這對於引用型別變數也同樣適用的。
    有時候,我們定義一個引用型別變數,在剛開始的時候,無法給出一個確定的值,但是不指定值,程式可能會在try語句塊中初始化值。這時候,我們下面使用變數的時候就會報錯。因此,可以先給變數指定一個null值,問題就解決了。例如:
 Connection conn=null;
try {
conn=Drivermanager get Connection("url", user","password");
}catch(SQLException e){
e printstacktrace();
6  }
7 String catalog=conn. getcatalog();

如果剛開始的時候不指定conn=null,則最後一句就會報錯。

二、null本身不是物件,也不是 Objet的例項,null本身雖然能代表一個不確定的物件,但就null本身來說,它不是物件,也不知道什麼型別,也不是java.lang.Objecte的例項。可以做一個簡單的例子:
//nul是物件嗎?屬於 Object型別嗎?

if(null instanceof java.lang.Object)
Systen.Out. println("null屬於java.lang. Object型別");
else
System.Out. println("null不屬於Java.lang.Object型別");
結果會輸出:
null不屬於Java.lang.Object型別
三、Java預設給變數賦值
    在定義變數的時候,如果定義後沒有給變數賦值,則Java在執行時會自動給變數賦值。賦值原則是整數型別int、byte、short、long的自動賦值為0帶小數點的 float、 double自動賦值為0.0boolean的自動賦值為 false;其他各供引用型別變數自動賦值為null,這個具體可以通過除錯來看。
四、容器型別與null
  List:允許重複元素,可以加入任意多null;
  Set:不允許重複元素,最多可以加入一個null;
  Map:Map的key最多可以加入ー個null,value欄位沒有限制;
  陣列:基本型別陣列,定義後如果不給定初始值,則java執行時會自動給定值;引用型別陣列,不給定初始值,則所有的元素值為null。
五、null的其他作用
  1、判判斷一個引用型別資料是否null,用==來判斷。
  2、釋放記憶體,讓一個非null的引用型別變數指向null,這樣這個物件就不再被任何物件應用了,等待JVM垃圾回收機制去回收。