Java 中你所不知道的null

先看一個示例,讀者可先自行閱讀判斷輸出結果:java

public class TestClass {
    private static void testMethod(){
         System.out.println("testMethod");
    }
    public static void main(String[] args) {
         ((TestClass)null).testMethod();
    }
 }


 上述事例會正確輸出:testMethod數組

分析:首先應該明白的是此處是針對類對方法的調用,而不是對象對方法的調用;ide

其次,testMethod方法是 statici靜態方法,直接使用"類方法"便可,由於靜態方法使用不依賴對象是否被建立。null能夠被強制類型轉換成任意類型(不是任意類型對象),因而能夠經過它來執行靜態方法;url

最後,非靜態方法用"對象 . 方法"的方式調用,必須依賴對象被建立後才能使用,若將testmethod()方法前的 static去掉,則會報空指針異常。此處也驗證了上面的觀點。固然,不論是否是靜態方法,都是已經存在的,只是訪問方式不一樣 spa

深刻理解

1、null是表明不肯定的對象

    Java中,null是一個關鍵字,用來標識一個不肯定的對象。所以能夠將null賦給引用類型變量,但不能夠將null賦值給基本類型変量。好比:int a=null; 是錯誤的;而Ojbect o=null是正確的。在Java中,變量的適用都遵循一個原則,先定義,而且初始化後,纔可使用。咱們不能int a 後,不給a指定值,就去打印a的值。這對於引用類型變量也一樣適用的。指針

    有時候,咱們定義一個引用類型變量,在剛開始的時候,沒法給出一個肯定的值,可是不指定值,程序可能會在try語句塊中初始化值。這時候,咱們下面使用變量的時候就會報錯。所以,能夠先給變量指定一個null值,問題就解決了。例如:調試

//java項目源碼 www.1b23.com
Connection conn=null;
 try {
     conn=Drivermanager get Connection("url", user","password"); 
 }catch(SQLException e){
     e printstacktrace();  
  }
 String catalog=conn. getcatalog();

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

2、null自己不是對象,也不是 Objet的實例

  null自己雖然能表明一個不肯定的對象,但就null自己來講,它不是對象,也不知道什麼類型,也不是java.lang.Objecte的實例。能夠作一個簡單的例子:對象

//java項目源碼 www.1b23.com
//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類型

3、Java默認給變量賦值

    在定義變量的時候,若是定義後沒有給變量賦值,則Java在運行時會自動給變量賦值。賦值原則是整數類型int、byte、short、long的自動賦值爲0;帶小數點的 float、 double自動賦值爲0.0, boolean的自動賦值爲 false;其餘各供引用類型變量自動賦值爲null,這個具體能夠經過調試來看。

4、容器類型與null

  List:容許重複元素,能夠加入任意多nullO;

  Set:不容許重複元素,最多能夠加入null;

  Map:Map的key最多能夠加入ー個null,value字段沒有限制;

  數組:基本類型數組,定義後若是不給定初始值,則java運行時會自動給定值;引用類型數組,不給定初始值,則全部的元素值爲null。

5、null的其餘做用

一、判判斷一個引用類型數據是否null,用==來判斷。

二、釋放內存,讓一個非null的引用類型變量指向null,這樣這個對象就再也不被任何對象應用了,等待JVM垃圾回收機制去回收

相關文章
相關標籤/搜索