java知識點3(null、引用相關知識(自己理解))
學習了相關博文,結合他們所說,再加上自己的理解,對引用資料型別的建立、賦值以及null等進行了總結。僅為自己理解,可能會有錯誤。
1、宣告一個物件不賦值與賦值為null的區別
假如有一個Person類宣告如下:
public class Person{ //成員變數 String name; int age; }
(1)如果是成員變數,比如Person類的name或者age欄位,不手動賦值的時候java會給個預設值,和變數的型別對應,string類被賦值為null,age類被賦值為0,這種情況發生 在如 Person student = new Person();時,定義了一個Person類的student物件,首先java自動將student物件中的name和age設定為null與0。如果沒有顯示宣告並且構 造函式也沒有對其賦值,那麼name和age則就為null和0。
(2)非成員物件時。
記住一句話:java中物件引用放在棧中,物件的例項放於堆中,一個物件要是隻宣告不賦值,則只會在記憶體的棧區建立引用,堆中並無此引用的指向。
1 Person student ; 2 Person student = null;
二者都在棧中儲存了student的引用,且都沒有在堆中建立物件的例項。
可以將Person student = null看成是student指向null,如右邊的圖。因為將Person student = null看成student指向null,因此相當於完成初始化,編譯不會報錯。
2、Person student = new Person();的建立過程
可拆分成 Person student; //在棧中開闢一塊空間,儲存student的引用,但此時引用並不指向堆中物件,及沒有建立聯絡。
student = new Person();//在堆中開闢一塊空間,儲存Person類物件的例項,並且將name、age初始化為null和0,隨後進行物件的顯示觸發(如果有),然後呼叫 構造方法(如果構造方法中有對name 和age的賦值,則會覆蓋顯示觸發時的值和初始化的值。賦值順序為:預設值----顯示觸發---構造 方法賦值)。賦值之後,將物件的地址付給棧中的引用(student)。
3、引用之間相互賦值
Person p1 = new Person(); Person p2 = new Person();
p1 = p2;
一個引用賦值給另一個引用,相當於兩個引用指向了堆中同一個物件,而堆中另一個物件則為垃圾,會被java垃圾機制回收。
以上為自己的理解,僅供參考,若有錯誤,煩請指證!!!