欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java必學(xué)必會(huì)之this關(guān)鍵字

 更新時(shí)間:2015年12月04日 10:08:26   作者:孤傲蒼狼  
java必學(xué)必會(huì)之this關(guān)鍵字,java中this的用法進(jìn)行了詳細(xì)的分析介紹,感興趣的小伙伴們可以參考一下

一、this關(guān)鍵字

  

this是一個(gè)引用,它指向自身的這個(gè)對(duì)象。

看內(nèi)存分析圖:

  假設(shè)我們?cè)诙褍?nèi)存new了一個(gè)對(duì)象,在這個(gè)對(duì)象里面你想象著他有一個(gè)引用this,this指向這個(gè)對(duì)象自己,所以這就是this,這個(gè)new出來(lái)的對(duì)象名字是什么,我們不知道,不知道也沒(méi)關(guān)系,因?yàn)檫@并不影響這個(gè)對(duì)象在內(nèi)存里面的存在,這個(gè)對(duì)象只要在內(nèi)存中存在,他就一定有一個(gè)引用this。

看下面的例子分析:

package cn.galc.test;

public class Leaf {

  int i = 0;

  public Leaf(int i) {
    this.i = i;
  }

  Leaf increament() {
    i++;
    return this;
  }

  void print() {
    System.out.println("i = " + i);
  }

  public static void main(String[] args) {
    Leaf leaf = new Leaf(100);
    leaf.increament().increament().print();
  }
}

在內(nèi)存中分析main方法的執(zhí)行過(guò)程

首先分析第一句話:Leaf leaf = new Leaf(100);

  程序執(zhí)行到這里的時(shí)候,??臻g里面有一個(gè)變量leaf,它指向了我們new出來(lái)的在堆空間里面的Leaf對(duì)象。new這個(gè)Leaf對(duì)象的時(shí)候,調(diào)用了構(gòu)造方法Leaf(),這個(gè)構(gòu)造方法里面有一個(gè)形參i,所以在??臻g里面給構(gòu)造方法分配有一小塊內(nèi)存,名字叫i用來(lái)裝傳遞過(guò)來(lái)的實(shí)參。這里傳過(guò)來(lái)的實(shí)參是100,所以i里面裝的值就是100。得到這個(gè)值之后,構(gòu)造方法繼續(xù)執(zhí)行,執(zhí)行this.i = i;這里就是把??臻g里面的i的值通過(guò)值傳遞給Leaf對(duì)象里面的成員變量i,所以成員變量i的值也變成了100。內(nèi)存中的布局如下圖所示:

  

  構(gòu)造方法執(zhí)行完之后,為這個(gè)構(gòu)造方法分配的內(nèi)存消失,所以棧里面的i所標(biāo)記的那一小塊內(nèi)存會(huì)消失。因此第一句話執(zhí)行完之后,內(nèi)存中的布局如下圖所示:

  

接下來(lái)分析第二句話:leaf.increament().increament().print();

  首先逐個(gè)分析:leaf.increament(),這里是調(diào)用increament()方法,是對(duì)new出來(lái)的那個(gè)Leaf對(duì)象調(diào)用的,leaf是Leaf對(duì)象的引用對(duì)象,因此通過(guò)這個(gè)引用對(duì)象來(lái)調(diào)用increament()方法,即相當(dāng)于是Leaf對(duì)象自己調(diào)用了increament()方法。increament()方法的定義如下:

Leaf increament(){
  i++;
  return this;

}

  因此Leaf對(duì)象調(diào)用increament()方法時(shí),首先執(zhí)行方法體里面的第一句話i++;這樣就把Leaf對(duì)象的成員變量i的值由原來(lái)的100變成了101。此時(shí)的內(nèi)存布局如下圖所示。

  接下來(lái)執(zhí)行方法體里面的第二句話:return this;

  這里把this作為返回值,當(dāng)有返回值的時(shí)候,首先會(huì)在棧里面給這個(gè)返回值分配一小塊臨時(shí)的存儲(chǔ)空間。這塊存儲(chǔ)空間里面的內(nèi)容是this里面的內(nèi)容。this指向它自身,所以棧內(nèi)存里面的那塊臨時(shí)存儲(chǔ)空間里面裝的this也是指向堆內(nèi)存里面的Leaf對(duì)象。

所以leaf.increament().increament().print();這句話里面的left.increament()這一小句話執(zhí)行完之后,內(nèi)存中的布局如下圖所示。

  

  leaf.increament().increament().print();這句話里面的left.increament()這一小句話執(zhí)行完之后,返回一個(gè)this,此時(shí)leaf.increament().increament().print();就相當(dāng)于是this.increament().print();

  接著棧里面的存儲(chǔ)在臨時(shí)空間里面的this調(diào)用increament()方法,而this指的就是Leaf對(duì)象,所以又是Leaf對(duì)象調(diào)用increament()方法。Leaf對(duì)象調(diào)用increament()方法時(shí),又會(huì)執(zhí)行方法體里面的i++,所以此時(shí)i又由原來(lái)的101變成了102。然后又執(zhí)行return this,所以棧內(nèi)存里面又多了一塊臨時(shí)存儲(chǔ)空間,里面裝的值也是this,這個(gè)this又是指向堆內(nèi)存里面的Leaf對(duì)象。因此此時(shí)這個(gè)Leaf對(duì)象有了四個(gè)指向他自己的引用對(duì)象。

  leaf.increament().increament().print();這句話里面的leaf.increament().increament()這一小句話執(zhí)行完之后,都返回了一個(gè)this,所以此時(shí)的leaf.increament().increament().print();就相當(dāng)于是這樣子的:this.this.print();

  接下來(lái)又是棧里面的那個(gè)新的this調(diào)用print()方法,使用this來(lái)調(diào)用,那就相當(dāng)于是Leaf對(duì)象來(lái)調(diào)用,Leaf對(duì)象自己調(diào)用print()方法將自己的i屬性的值打印出來(lái),所以打印出來(lái)的結(jié)果應(yīng)該是102。

  因此main方法里面的整個(gè)程序執(zhí)行完之后,內(nèi)存中的布局如下圖所示:

  

  this的總結(jié):this一般出現(xiàn)在方法里面,當(dāng)這個(gè)方法還沒(méi)有調(diào)用的時(shí)候,this指的是誰(shuí)并不知道。但是實(shí)際當(dāng)中,你如果new了一個(gè)對(duì)象出來(lái),那么this指的就是當(dāng)前這個(gè)對(duì)象。對(duì)哪個(gè)對(duì)象調(diào)用方法,this指的就是調(diào)用方法的這個(gè)對(duì)象(你對(duì)哪個(gè)對(duì)象調(diào)用這個(gè)方法,this指的就是誰(shuí))。如果再new一個(gè)對(duì)象,這個(gè)對(duì)象他也有自己的this,他自己的this就當(dāng)然指的是他自己了。

以圖文相結(jié)合的方式為大家詳細(xì)介紹java this關(guān)鍵字,希望能夠幫助到大家更好地理解this關(guān)鍵字。

相關(guān)文章

  • JVM實(shí)戰(zhàn)系列之CPU100%和內(nèi)存100%排查

    JVM實(shí)戰(zhàn)系列之CPU100%和內(nèi)存100%排查

    本文主要介紹了JVM實(shí)戰(zhàn)系列之CPU100%和內(nèi)存100%排查,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Ajax實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)

    Ajax實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)

    這篇文章主要為大家詳細(xì)介紹了jQuery ajax實(shí)現(xiàn)省市縣三級(jí)聯(lián)動(dòng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能幫助到你
    2021-07-07
  • 深入分析RabbitMQ中死信隊(duì)列與死信交換機(jī)

    深入分析RabbitMQ中死信隊(duì)列與死信交換機(jī)

    這篇文章主要介紹了RabbitMQ中死信隊(duì)列與死信交換機(jī),死信隊(duì)列就是一個(gè)普通的交換機(jī),有些隊(duì)列的消息成為死信后,一般情況下會(huì)被RabbitMQ清理,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • Java算法之位圖的概念和實(shí)現(xiàn)詳解

    Java算法之位圖的概念和實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java算法之位圖的概念和實(shí)現(xiàn)詳解,位圖可以利用每一位來(lái)對(duì)應(yīng)一個(gè)值,比如可以利用int類(lèi)型的數(shù)去存儲(chǔ)0~31這個(gè)集合的數(shù)字,如果該集合內(nèi)的數(shù)字存在,則把對(duì)應(yīng)的位設(shè)置位1默認(rèn)為0,需要的朋友可以參考下
    2023-10-10
  • 你什么是Elastic Stack(ELK)

    你什么是Elastic Stack(ELK)

    這篇文章主要介紹了你什么是Elastic Stack(ELK),ELK是三款軟件的簡(jiǎn)稱(chēng),分別是Elasticsearch、Logstash、Kibana組成,需要的朋友可以參考下
    2023-04-04
  • java實(shí)現(xiàn)短地址服務(wù)的方法(附代碼)

    java實(shí)現(xiàn)短地址服務(wù)的方法(附代碼)

    大多數(shù)情況下URL太長(zhǎng),字符多,不便于發(fā)布復(fù)制和存儲(chǔ),本文就介紹了通過(guò)java實(shí)現(xiàn)短地址服務(wù),減少了許多使用太長(zhǎng)URL帶來(lái)的不便,需要的朋友可以參考下
    2015-07-07
  • java設(shè)計(jì)模式之單例模式解析

    java設(shè)計(jì)模式之單例模式解析

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之單例模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Spring實(shí)戰(zhàn)之Bean的后處理器操作示例

    Spring實(shí)戰(zhàn)之Bean的后處理器操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean的后處理器操作,結(jié)合實(shí)例形式詳細(xì)分析了Bean的后處理器相關(guān)配置、操作方法及使用注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • 如何把idea中的項(xiàng)目導(dǎo)入github倉(cāng)庫(kù)中(圖文詳解)

    如何把idea中的項(xiàng)目導(dǎo)入github倉(cāng)庫(kù)中(圖文詳解)

    這篇文章主要介紹了如何把idea中的項(xiàng)目導(dǎo)入github倉(cāng)庫(kù)中,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java實(shí)現(xiàn)飛機(jī)大戰(zhàn)案例詳解

    java實(shí)現(xiàn)飛機(jī)大戰(zhàn)案例詳解

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)飛機(jī)大戰(zhàn)案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03

最新評(píng)論