1. 程式人生 > >java知識點3(null、引用相關知識(自己理解))

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垃圾機制回收。

以上為自己的理解,僅供參考,若有錯誤,煩請指證!!!