亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java必學必會之this關鍵字

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

一、this關鍵字

  

this是一個引用,它指向自身的這個對象。

看內存分析圖:

  假設我們在堆內存new了一個對象,在這個對象里面你想象著他有一個引用this,this指向這個對象自己,所以這就是this,這個new出來的對象名字是什么,我們不知道,不知道也沒關系,因為這并不影響這個對象在內存里面的存在,這個對象只要在內存中存在,他就一定有一個引用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();
  }
}

在內存中分析main方法的執(zhí)行過程

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

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

  

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

  

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

  首先逐個分析:leaf.increament(),這里是調用increament()方法,是對new出來的那個Leaf對象調用的,leaf是Leaf對象的引用對象,因此通過這個引用對象來調用increament()方法,即相當于是Leaf對象自己調用了increament()方法。increament()方法的定義如下:

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

}

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

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

  這里把this作為返回值,當有返回值的時候,首先會在棧里面給這個返回值分配一小塊臨時的存儲空間。這塊存儲空間里面的內容是this里面的內容。this指向它自身,所以棧內存里面的那塊臨時存儲空間里面裝的this也是指向堆內存里面的Leaf對象。

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

  

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

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

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

  接下來又是棧里面的那個新的this調用print()方法,使用this來調用,那就相當于是Leaf對象來調用,Leaf對象自己調用print()方法將自己的i屬性的值打印出來,所以打印出來的結果應該是102。

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

  

  this的總結:this一般出現在方法里面,當這個方法還沒有調用的時候,this指的是誰并不知道。但是實際當中,你如果new了一個對象出來,那么this指的就是當前這個對象。對哪個對象調用方法,this指的就是調用方法的這個對象(你對哪個對象調用這個方法,this指的就是誰)。如果再new一個對象,這個對象他也有自己的this,他自己的this就當然指的是他自己了。

以圖文相結合的方式為大家詳細介紹java this關鍵字,希望能夠幫助到大家更好地理解this關鍵字。

相關文章

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

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

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

    Ajax實現省市區(qū)三級聯動

    這篇文章主要為大家詳細介紹了jQuery ajax實現省市縣三級聯動的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能幫助到你
    2021-07-07
  • 深入分析RabbitMQ中死信隊列與死信交換機

    深入分析RabbitMQ中死信隊列與死信交換機

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

    Java算法之位圖的概念和實現詳解

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

    你什么是Elastic Stack(ELK)

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

    java實現短地址服務的方法(附代碼)

    大多數情況下URL太長,字符多,不便于發(fā)布復制和存儲,本文就介紹了通過java實現短地址服務,減少了許多使用太長URL帶來的不便,需要的朋友可以參考下
    2015-07-07
  • java設計模式之單例模式解析

    java設計模式之單例模式解析

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

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

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

    如何把idea中的項目導入github倉庫中(圖文詳解)

    這篇文章主要介紹了如何把idea中的項目導入github倉庫中,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • java實現飛機大戰(zhàn)案例詳解

    java實現飛機大戰(zhàn)案例詳解

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

最新評論