讓我們從下面的聲明開始吧:
String x = null;
上面的聲明到底做了什么?
回憶一下,什么是變量,什么是值?通常把變量比作一個箱子,就像你可以用箱子裝一些東西那樣,您可以用變量來保持一個值。當聲明一個變量的時候,我們需要設置變量的類型。
Java中有兩種主要的類型:基本數據類型和引用類型。變量就可以聲明為基本數據類型也可以聲明為引用類型。在這種情況下,初始化聲明聲明了一個變量"X",“X” 保存了一個字符串的引用,這里的引用是null。
下面的圖片給了我們一個對這個概念更加清晰的理解。
what-exactly-is-null-in-java
如果 x="abc",它看上去應該像下面這樣:
what-exactly-is-null-in-java
2.null在內存中到底是什么呢?
null在內存中到底是什么呢?或者說null值在Java中是什么呢?
首先,null不是有效的對象實例,所以不需要為它分配內存空間,它僅僅只是一個表明該引用目前沒有指向任何對象的值。
JVM規范中有這么一句話:
The Java Virtual Machine specification does not mandate a concrete value encoding null.
JVM規范沒有指明一個編碼為null的具體值。
它表現為像C語言中的0地址那樣的東西。
3.x在內存中到底是什么呢?
現在我們知道了null是什么東西了,此外,我們也知道了變量是一個保存了一些值的存儲空間的地址。那么x到底在內存的哪個地方呢?
從“JVM運行時的數據存儲區”示意圖中我們知道,既然每一個方法在線程棧中都有一個私有的棧幀,本地變量被放在棧幀中。
引用:
1.變量,操作符號和表達式
2.變量
3.JVM規范