this是一個引用,它指向自身的這個對象。佈局
看內存分析圖:this
假設咱們在堆內存new了一個對象,在這個對象裏面你想象着他有一個引用this,this指向這個對象本身,因此這就是this,這個new出來的對象名字是什麼,咱們不知道,不知道也不要緊,由於這並不影響這個對象在內存裏面的存在,這個對象只要在內存中存在,他就必定有一個引用this。spa
看下面的例子分析:code
1 package cn.galc.test; 2 3 public class Leaf { 4 5 int i = 0; 6 7 public Leaf(int i) { 8 this.i = i; 9 } 10 11 Leaf increament() { 12 i++; 13 return this; 14 } 15 16 void print() { 17 System.out.println("i = " + i); 18 } 19 20 public static void main(String[] args) { 21 Leaf leaf = new Leaf(100); 22 leaf.increament().increament().print(); 23 } 24 }
在內存中分析main方法的執行過程對象
首先分析第一句話:Leaf leaf = new Leaf(100);blog
程序執行到這裏的時候,棧空間裏面有一個變量leaf,它指向了咱們new出來的在堆空間裏面的Leaf對象。new這個Leaf對象的時候,調用了構造方法Leaf(),這個構造方法裏面有一個形參i,因此在棧空間裏面給構造方法分配有一小塊內存,名字叫i用來裝傳遞過來的實參。這裏傳過來的實參是100,因此i裏面裝的值就是100。獲得這個值以後,構造方法繼續執行,執行this.i = i;這裏就是把棧空間裏面的i的值經過值傳遞給Leaf對象裏面的成員變量i,因此成員變量i的值也變成了100。內存中的佈局以下圖所示:內存
構造方法執行完以後,爲這個構造方法分配的內存消失,因此棧裏面的i所標記的那一小塊內存會消失。所以第一句話執行完以後,內存中的佈局以下圖所示:class
接下來分析第二句話:leaf.increament().increament().print();test
首先逐個分析:leaf.increament(),這裏是調用increament()方法,是對new出來的那個Leaf對象調用的,leaf是Leaf對象的引用對象,所以經過這個引用對象來調用increament()方法,即至關因而Leaf對象本身調用了increament()方法。increament()方法的定義以下:變量
Leaf increament(){ i++; return this; }
所以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就固然指的是他本身了。