程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java必學必會之this症結字

java必學必會之this症結字

編輯:關於JAVA

java必學必會之this症結字。本站提示廣大學習愛好者:(java必學必會之this症結字)文章只能為提供參考,不一定能成為您想要的結果。以下是java必學必會之this症結字正文


1、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辦法的履行進程

起首剖析第一句話: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(){
  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就固然指的是他本身了。

以圖文相聯合的方法為年夜家具體引見java this症結字,願望可以或許贊助到年夜家更好地輿解this症結字。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved