淺談Java中的this作為返回值時(shí)返回的是什么
有時(shí)會(huì)遇到this作為返回值的情況,那么此時(shí)返回的到底是什么呢?
返回的是調(diào)用this所處方法的那個(gè)對(duì)象的引用,讀起來(lái)有點(diǎn)繞口哈,有沒(méi)有想起小學(xué)語(yǔ)文分析句子成份的試題,哈哈。
一點(diǎn)點(diǎn)分析的話(huà),主干是“返回的是引用”;
什么引用呢?“那個(gè)對(duì)象的引用”;
哪個(gè)對(duì)象呢?“調(diào)用方法的那個(gè)對(duì)象”;
調(diào)用的哪個(gè)方法呢?“調(diào)用的是this所位于的方法”;這樣就清楚了。
再總結(jié)一下就是,this作為返回值時(shí),返回的是調(diào)用某方法的對(duì)象的引用,這個(gè)方法正是包含“return this;”這行命令的那個(gè)方法;更簡(jiǎn)單點(diǎn)說(shuō),就是誰(shuí)調(diào)用返回的就是誰(shuí)。
為了更清楚、直觀的理解問(wèn)題,下面以簡(jiǎn)單的例子說(shuō)明。
包human中定義了Person類(lèi),代碼如下:
package human; public class Person { String name; int age; public Person() { } public Person(String n, String g) { name = n; gender = g; } //test:this作返回值 Person reThis1() { Person per = new Person("lu","female"); System.out.println("reThis1 per:" + per.name); return this; } Person reThis2() { Person per = reThis1(); System.out.println("reThis2 per:" + per.name); return this; } Person reThis3() { name = "ma"; return this; } static void equRefer(Person per1, Person per2) { if(per1 == per2) System.out.println("per1指向的對(duì)象沒(méi)有改變,仍與per2指向同一個(gè)對(duì)象"); else System.out.println("per1指向的對(duì)象已改變,與per2指向不同的對(duì)象"); System.out.println("per1:" + per1.name); System.out.println("per2:" + per2.name); } public static void main(String[] args) { Person per1 = new Person("liu","female"); Person per2 = per1; per1 = per1.reThis1(); Person.equRefer(per1, per2); per1 = per1.reThis2(); Person.equRefer(per1, per2); System.out.println("調(diào)用reThis3之前,per1.name=" + per1.name); per1 = per1.reThis3(); System.out.println("調(diào)用reThis3之后,per1.name=" + per1.name); } }
輸出結(jié)果如下:
reThis1 per:lu per1指向的對(duì)象沒(méi)有改變,仍與per2指向同一個(gè)對(duì)象 per1:liu per2:liu reThis1 per:lu reThis2 per:liu per1指向的對(duì)象沒(méi)有改變,仍與per2指向同一個(gè)對(duì)象 per1:liu per2:liu 調(diào)用reThis3之前,per1.name=liu 調(diào)用reThis3之后,per1.name=ma
逐句分析執(zhí)行過(guò)程:
(1).第1句:Person per1 = new Person("liu","female");
創(chuàng)建一個(gè)Person對(duì)象,將name初始化為“l(fā)iu”,gender初始化為“female”,并讓per1指向該對(duì)象。
(2).第2句:Person per2 = per1;
定義一個(gè)Person類(lèi)的對(duì)象引用,并與per1指向同一個(gè)對(duì)象;具體內(nèi)存分配見(jiàn)圖1:
(3).第3句:per1 = per1.reThis1();
由per1調(diào)用reThis1()方法,并將返回值賦給per1;reThis1()方法體內(nèi)定義了一個(gè)局部變量per,并創(chuàng)建一個(gè)對(duì)象,由per指向它;具體內(nèi)存分配見(jiàn)圖2:
緊接著輸出reThis1 per:lu;最后返回this,并把返回的值賦給per1。
(4).第4句:Person.equRefer(per1, per2);
調(diào)用equRefer(per1,per2)來(lái)驗(yàn)證per1的值并未改變;根據(jù)下面的輸出結(jié)果也可知per1仍與per2指向原來(lái)的對(duì)象,也就是說(shuō)此時(shí)this的值與per1的值是一致的;也可以說(shuō),誰(shuí)調(diào)用的返回的就是誰(shuí)。
輸出結(jié)果:
per1指向的對(duì)象沒(méi)有改變,仍與per2指向同一個(gè)對(duì)象
per1:liu
per2:liu
此時(shí)的內(nèi)存圖如圖3:
(5).第5句:per1 = per1.reThis2();
per1調(diào)用reThis2(),由(4)可推測(cè),此時(shí)per1的值也不會(huì)變,是由per1調(diào)用的this所處的方法,所以返回的也是per1;具體來(lái)分析的話(huà),reThis2()定義了一個(gè)局部變量per,并給其賦值為reThis1(),也就是說(shuō)reThis2()調(diào)用了reThis1(),由(3)、(4)可推知,此時(shí)的內(nèi)存結(jié)構(gòu)是下面這樣的:
局部變量per指向的對(duì)象與per1是一致的,因?yàn)檎{(diào)用reThis1的對(duì)象是per1所指的對(duì)象,所以返回值也是per1。
此處的輸出結(jié)果為:
reThis1 per:lu
reThis2 per:liu
(6).第6句:Person.equRefer(per1, per2);
驗(yàn)證上面的結(jié)論,per1指向沒(méi)變,此時(shí)的內(nèi)存分配圖如圖4所示:
(7).第7、8、9句:
System.out.println("調(diào)用reThis3之前,per1.name=" + per1.name);
per1 = per1.reThis3();
System.out.println("調(diào)用reThis3之后,per1.name=" + per1.name);
per1調(diào)用reThis3();reThis3()中修改了namer的值,由"liu"改為"ma",然后返回this。
調(diào)用前后的內(nèi)存結(jié)構(gòu)分別如圖6、圖7所示:
輸出結(jié)果:
調(diào)用reThis3之前,per1.name=liu
調(diào)用reThis3之后,per1.name=ma
再一次驗(yàn)證了上述的結(jié)論。
關(guān)于為什么使用this,我是這么理解的:由于定義類(lèi)的時(shí)候尚未創(chuàng)建對(duì)象,所以不能確定對(duì)象到底叫什么,就用this來(lái)統(tǒng)一表示,等到具體調(diào)用時(shí)就可以知道對(duì)象的名字了,然后就用對(duì)象的引用替換this;所以為了便于記憶,可以理解成誰(shuí)調(diào)用返回的就是誰(shuí)。
至于返回this有什么意義,我的理解是:記返回this的方法為A,可能A的方法體中對(duì)對(duì)象的屬性做了某些操作或調(diào)用了某些方法完成了某些動(dòng)作,總之,做完這些操作后就把原對(duì)象的引用返回,返回后的狀態(tài)是對(duì)象最新的狀態(tài),可能與對(duì)象調(diào)用方法A前不同。
以上這篇淺談Java中的this作為返回值時(shí)返回的是什么就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java并發(fā)編程this逃逸問(wèn)題總結(jié)
- Java中super和this的用法詳解
- Java this super代碼實(shí)例及使用方法總結(jié)
- java使用this調(diào)用構(gòu)造函數(shù)的實(shí)現(xiàn)方法示例
- Java中this,static,final,const用法詳解
- 詳解Java基礎(chǔ)篇--面向?qū)ο?(構(gòu)造方法,static、this關(guān)鍵字)
- java中this的n種使用方法
- Java this 關(guān)鍵字的使用方法詳解
- java中this與super關(guān)鍵字的使用方法
- Java 中This用法的實(shí)例詳解
- java this引用逃逸詳解
相關(guān)文章
java字節(jié)流知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是關(guān)于java字節(jié)流的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們跟著學(xué)習(xí)參考下。2019-07-07windows 32位eclipse遠(yuǎn)程hadoop開(kāi)發(fā)環(huán)境搭建
這篇文章主要介紹了windows 32位eclipse遠(yuǎn)程hadoop開(kāi)發(fā)環(huán)境搭建的相關(guān)資料,需要的朋友可以參考下2016-07-07并發(fā)編程ConcurrentLinkedQueue示例詳解
這篇文章主要為大家介紹了并發(fā)編程ConcurrentLinkedQueue使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Spring Boot快速實(shí)現(xiàn) IP地址解析的示例詳解
這篇文章主要介紹了Spring Boot快速實(shí)現(xiàn)IP地址解析,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08SpringBoot集成ShedLock實(shí)現(xiàn)分布式定時(shí)任務(wù)流程詳解
ShedLock是一個(gè)鎖,官方解釋是他永遠(yuǎn)只是一個(gè)鎖,并非是一個(gè)分布式任務(wù)調(diào)度器。一般shedLock被使用的場(chǎng)景是,你有個(gè)任務(wù),你只希望他在單個(gè)節(jié)點(diǎn)執(zhí)行,而不希望他并行執(zhí)行,而且這個(gè)任務(wù)是支持重復(fù)執(zhí)行的2023-02-02