一、this關鍵字
this是乙個引用,它指向自身的這個物件。
看記憶體分析圖:
假設我們在堆記憶體new了乙個物件,在這個物件裡面你想象著他有乙個引用this,this指向這個物件自己,所以這就是this,這個new出來的物件名字是什麼,我們不知道,不知道也沒關係,因為這並不影響這個物件在記憶體裡面的存在,這個物件只要在記憶體中存在,他就一定有乙個引用this。
看下面的例子分析:
在記憶體中分析main方法的執行過程
首先分析第一句話:leaf leaf = new leaf(100);
程式執行到這裡的時候,棧空間裡面有乙個變數leaf,它指向了我們new出來的在堆空間裡面的leaf物件。new這個leaf物件的時候,呼叫了構造方法leaf(),這個構造方法裡面有乙個形參i,所以在棧空間裡面給構造方法分配有一小塊記憶體,名字叫i用來裝傳遞過來的實參。這裡傳過來的實參是100,所以i裡面裝的值就是100。得到這個值之後,構造方法繼續執行,執行this.i = i;這裡就是把棧空間裡面的i的值通過值傳遞給leaf物件裡面的成員變數i,所以成員變數i的值也變成了100。記憶體中的布局如下圖所示:
構造方法執行完之後,為這個構造方法分配的記憶體消失,所以棧裡面的i所標記的那一小塊記憶體會消失。因此第一句話執行完之後,記憶體中的布局如下圖所示:
接下來分析第二句話:leaf.increament().increament().print();
首先逐個分析:leaf.increament(),這裡是呼叫increament()方法,是對new出來的那個leaf物件呼叫的,leaf是leaf物件的引用物件,因此通過這個引用物件來呼叫increament()方法,即相當於是leaf物件自己呼叫了increament()方法。increament()方法的定義如下:
leaf increament()
因此leaf物件呼叫increament()方法時,首先執行方法體裡面的第一句話i++;這樣就把leaf物件的成員變數i的值由原來的100變成了101。此時的記憶體布局如下圖所示。
接下來執行方法體裡面的第二句話:return this;
這裡把this作為返回值,當有返回值的時候,首先會在棧裡面給這個返回值分配一小塊臨時的儲存空間。這塊儲存空間裡面的內容是this裡面的內容。this指向它自身,所以棧記憶體裡面的那塊臨時儲存空間裡面裝的this也是指向堆記憶體裡面的leaf物件。
所以leaf.increament().increament().print();這句話裡面的left.increament()這一小句話執行完之後,記憶體中的布局如下圖所示。
leaf.increament().increament().print();這句話裡面的left.increament()這一小句話執行完之後,返回乙個this,此時leaf.increament().increament().print();就相當於是this.increament().print();
接著棧裡面的儲存在臨時空間裡面的this呼叫increament()方法,而this指的就是leaf物件,所以又是leaf物件呼叫increament()方法。leaf物件呼叫increament()方法時,又會執行方法體裡面的i++,所以此時i又由原來的101變成了102。然後又執行return this,所以棧記憶體裡面又多了一塊臨時儲存空間,裡面裝的值也是this,這個this又是指向堆記憶體裡面的leaf物件。因此此時這個leaf物件有了四個指向他自己的引用物件。
leaf.increament().increament().print();這句話裡面的leaf.increament().increament()這一小句話執行完之後,都返回了乙個this,所以此時的leaf.increament().increament().print();就相當於是這樣子的:this.this.print();
接下來又是棧裡面的那個新的this呼叫print()方法,使用this來呼叫,那就相當於是leaf物件來呼叫,leaf物件自己呼叫print()方法將自己的i屬性的值列印出來,所以列印出來的結果應該是102。
因此main方法裡面的整個程式執行完之後,記憶體中的布局如下圖所示:
this的總結:this一般出現在方法裡面,當這個方法還沒有呼叫的時候,this指的是誰並不知道。但是實際當中,你如果new了乙個物件出來,那麼this指的就是當前這個物件。對哪個物件呼叫方法,this指的就是呼叫方法的這個物件(你對哪個物件呼叫這個方法,this指的就是誰)。如果再new乙個物件,這個物件他也有自己的this,他自己的this就當然指的是他自己了。
文章每週持續更新,可以微❤搜尋「 十分鐘學程式設計 」第一時間閱讀和催更,如果這個文章寫得還不錯,覺得有點東西的話 ~求點贊? 求關注❤️ 求分享❤️
各位的支援和認可,就是我創作的最大動力,我們下篇文章見!
java基礎總結07 物件導向3 this關鍵字
this是乙個引用,它指向自身的這個物件。看記憶體分析圖 假設我們在堆記憶體new了乙個物件,在這個物件裡面你想象著他有乙個引用this,this指向這個物件自己,所以這就是this,這個new出來的物件名字是什麼,我們不知道,不知道也沒關係,因為這並不影響這個物件在記憶體裡面的存在,這個物件只要在...
java基礎學習總結 基礎語法2
1.1.2 分支語句 switch語句 學會畫記憶體分析圖分析別人寫的程式,這樣就很容易分析出規律,分析出規律也就明白了別人的演算法,也就很容易讀懂別人的程式。分析到i等於3以後,基本上已經得到規律了,這個程式要計算的就是 result 1 2 3 10 由此可以看出,懂得畫記憶體去分析程式對讀懂別...
java基礎總結
float 賦值時後邊加f 如 float ff 1.2f 靜態變數 宣告時前邊 static 如static int x 0 資料型別轉換 低精度可以直接轉換成高精度,高精度轉換成低精度 需要顯示型別轉換 int x 50 float y x 顯示轉換 int a int 45.23 foreac...