徹底理解Java中this 關(guān)鍵字
this關(guān)鍵字再java里面是一個(gè)我認(rèn)為非常不好理解的概念,:)也許是太笨的原因
this 關(guān)鍵字的含義:可為以調(diào)用了其方法的那個(gè)對(duì)象生成相應(yīng)的句柄。
怎么理解這段話呢?
thinking in java里面有這么一個(gè)例子
有兩個(gè)同一個(gè)類型的對(duì)象,分別叫做a和b,那我們?cè)鯓訁^(qū)別在調(diào)用方法f()的時(shí)候,是誰再調(diào)用這個(gè)方法呢?
例如:
class Banana { void f(int i){ /***方法主體*****/ } } Banana a = new Banana();//生成Banana的對(duì)象a Banana b= new Banana();//生成Banana的對(duì)象b a.f(1); b.f(2);
那么編譯器是怎樣知道你是要調(diào)用哪個(gè)對(duì)象的f()函數(shù)呢?其實(shí)幕后的傳送應(yīng)該是:
a.f(1)<<====>>Banana.f(a,1); b.f(1)<<====>>Banana.f(b,2);
我理解為:生成一個(gè)Banana的對(duì)象a,調(diào)用a的方法f()的時(shí)候,會(huì)同時(shí)生成一個(gè)指向這個(gè)對(duì)象的一個(gè)句柄this
這里就是this 這個(gè)指向?qū)ο?new Banana()或者 this 在這里等價(jià)于句柄 a;this《==》a;
當(dāng)我們?cè)谝粋€(gè)方法的內(nèi)部的時(shí)候。并且希望獲得當(dāng)前對(duì)象的句柄,由于這個(gè)句柄時(shí)編譯器秘密傳遞的,所以時(shí)沒有明確的標(biāo)志符來識(shí)別的,這個(gè)時(shí)候我們可以使用this這個(gè)關(guān)鍵字
this的通俗含義:不論是生成的哪個(gè)對(duì)象調(diào)用了這個(gè)方法,都會(huì)生成一個(gè)指向這個(gè)對(duì)象的指針 this
thinking in java 里面的經(jīng)典例子:
public class Leaf{ private int i=0; Leaf increment(){ i++; return this; } void print(){ Systme.out.println("i="+i); public static void main (String [] args) { Leaf x =new Leaf(); x.increment().increment(). increment().print(); } }
1、生成一個(gè)對(duì)象的句柄 x ;語法格式為 Leaf x;
2、生成一個(gè)Leaf class的對(duì)象;語法格式為 new Leaf();
3、建立句柄與對(duì)象的聯(lián)系 ;語法為 x = new Leaf();
4、調(diào)用對(duì)象 new Leaf()里面的方法 increment();語法為 x.increment()
×××誰調(diào)用了方法 increment()呢?是Leaf類的對(duì)象x(或者是new Leaf()),所以對(duì)應(yīng)系統(tǒng)會(huì)生成一個(gè)this 引用,并把它秘密的指向 x 或者是 指向 new Leaf()這個(gè)對(duì)象,所以 increment()返回的是一個(gè)指向x的引用!是一個(gè)內(nèi)存的地址,我們可以把它打印出來看看,就知道了!
以上內(nèi)容是小編給大家介紹的Java中this 關(guān)鍵字的知識(shí),希望對(duì)大家有所幫助!
相關(guān)文章
java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07為Java應(yīng)用創(chuàng)建Docker鏡像的3種方式總結(jié)
Docker的使用可以將應(yīng)用程序做成鏡像,這樣可以將鏡像發(fā)布到私有或者公有倉庫中,在其他主機(jī)上也可以pull鏡像,并且運(yùn)行容器,運(yùn)行程,下面這篇文章主要給大家總結(jié)介紹了關(guān)于為Java應(yīng)用創(chuàng)建Docker鏡像的3種方式,需要的朋友可以參考下2023-06-06調(diào)用Mybatis?plus中的saveBatch方法報(bào)找不到表的問題
在用Mybatis plus開發(fā)的項(xiàng)目中,用自帶的API批量保存的方法saveBatch操作時(shí),發(fā)現(xiàn)報(bào)沒有找到表的錯(cuò)誤,本文就來詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2024-03-03SpringBoot實(shí)現(xiàn)Md5對(duì)數(shù)據(jù)庫數(shù)據(jù)加密的示例
本文主要介紹了SpringBoot實(shí)現(xiàn)Md5對(duì)數(shù)據(jù)庫數(shù)據(jù)加密的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動(dòng)取消訂單
這篇文章主要介紹了Springboot的ThreadPoolTaskScheduler線程池輕松搞定15分鐘不操作自動(dòng)取消訂單,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01java中instanceof與Class的等價(jià)性代碼示例
這篇文章主要介紹了java中instanceof與Class的等價(jià)性代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01