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症結字。