java NULL 關鍵字

翻譯人員: 鐵錨
翻譯時間: 2013年11月11日html

原文連接: What exactly is null in Java?java

讓咱們先來看下面的語句:算法

String x = null;

1. 這個語句到底作了些什麼?
  讓咱們回顧一下什麼是變量,什麼是變量值。一個常見的比喻是 變量至關於一個盒子。如同可使用盒子來儲存物品同樣,您可使用一個變量來存儲一個值。當聲明一個變量時,咱們須要設置其類型。
在Java中變量分爲兩大類型: 原始值(primitive)與引用值(reference).
聲明爲原始類型的變量,存儲的是實際的值;聲明爲引用類型的變量,存儲的是實際對象的地址(指針,引用).
在上面的語句中, 初始化語句定義了一個變量 "x". x中存放的是String引用,此處爲 null.
下圖對此概念提供了更形象的說明:安全

若是 x = "abc",則引用示意圖以下:oracle

2. 在內存中null具體是什麼?
在Java中 null 值是什麼,在內存中null是什麼?
首先須要明確,null不是一個合法的object實例,因此並無爲其分配內存. 
null 僅僅用於代表該引用目前沒有指向任何對象。
咱們看看 JVM規範 的描述:jvm

The Java Virtual Machine specification does not mandate a concrete value encoding null.編碼

Java虛擬機規範沒有強制要求編碼null的具體值。spa

我認爲和其它類C語言同樣,null是對引用變量的值所有置0。
譯者注: Java對象的屬性域默認初始化其實很簡單,把分配的內存全部位所有置0,因此 數字是0, boolean是false, 浮點是 0.0f, 引用是 null, 由於引用是內存地址,因此能夠推測出 null 實際上就是一堆0. 用鼠標手想想也就明白, 地址 0 確定是不能夠存聽任何對象的。
3. x在內存中存放在何處?
如今咱們知道什麼是null,而且也知道一個變量就是一個存儲位置加上一個相關的符號名(標識符),包含了一些值。那麼x存放在內存中的什麼地方呢?
經過閱讀   .net

JVM 運行時數據區 

 咱們知道,既然每一個方法都在線程的棧空間中有一個私有的棧幀,那麼局部變量就存放在棧幀裏面.
補充說明: 若是語句在方法內部,那麼x就是局部變量,存放在棧幀之中.
若是在編寫不規範的代碼中,例如 線程

可是將 private 忘記寫了,則會從屬於對象,分配在堆內存的某個對象內部。
 

1. null設計初衷: 是爲了表示一些缺失的東西,例如缺失的用戶、資源或其餘東西。

2. null是Java中的關鍵字,像public、static、final。它是大小寫敏感的。

3. Java中的任何引用變量都將null做爲默認值。

4. null既不是對象也不是一種類型,它僅是一種特殊的值,你能夠將其賦予任何引用類型,但不能將null賦給基本類型變量。你也能夠將null轉化成任何類型。

5. 可是若是將null賦值給包裝類object,而後將object賦給各自的基本類型,編譯器不會報,可是你將會在運行時期遇到空指針異常。這是Java中的自動拆箱致使的。

6. 任何含有null值的包裝類在Java拆箱生成基本數據類型時候都會拋出一個空指針異常。

7. 若是使用了帶有null值的引用類型變量,instanceof操做將會返回false。這是instanceof操做一個很重要的特性,使得對類型強制轉換檢查頗有用。

8. 你可能知道不能調用非靜態方法來使用一個值爲null的引用類型變量。它將會拋出空指針異常,可是你可能不知道,你可使用靜態方法來使用一個值爲null的引用類型變量。由於靜態方法使用靜態綁定,不會拋出空指針異常。

9. 你能夠將null傳遞給方法使用,這時方法能夠接收任何引用類型,例如public void print(Object obj)能夠這樣調用print(null)。從編譯角度來看這是能夠的,但結果徹底取決於方法。Null安全的方法,如在這個例子中的print方法,不會拋出空指針異常,只是優雅的退出。若是業務邏輯容許的話,推薦使用null安全的方法。

10. 你可使用==或者!=操做來比較null值,可是不能使用其餘算法或者邏輯操做,例如小於或者大於。跟SQL不同,在Java中null==null將返回true

原文地址:http://mp.weixin.qq.com/s/PTBS9rgb1EVQtaRD3rB_uA

相關文章
相關標籤/搜索