先看一個示例,讀者可先自行閱讀判斷輸出結果:
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(); } 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.0, boolean的自動賦值為 false;其他各供參考型別變數自動賦值為null,這個具體可以通過除錯來看,
四、容器型別與null
List:允許重復元素,可以加入任意多nullO;
Set:不允許重復元素,最多可以加入null;
Map:Map的key最多可以加入ー個null,value欄位沒有限制;
陣列:基本型別陣列,定義后如果不給定初始值,則java運行時會自動給定值;參考型別陣列,不給定初始值,則所有的元素值為null,
五、null的其他作用
1、判判斷一個參考型別資料是否null,用==來判斷,
2、釋放記憶體,讓一個非null的參考型別變數指向null,這樣這個物件就不再被任何物件應用了,等待JVM垃圾回識訓制去回收,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/3001.html
標籤:Java
下一篇:寫出一手爛代碼的 19 條準則!
