java基礎學習總結——this關鍵字

1、this關鍵字

  

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對象調用的,leafLeaf對象的引用對象,所以經過這個引用對象來調用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就固然指的是他本身了。

相關文章
相關標籤/搜索