最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java中的this作為返回值時(shí)返回的是什么

 更新時(shí)間:2017年11月10日 09:07:25   作者:蟬蟬  
Java中的this作為返回值時(shí)返回的是什么?下面小編就為大家介紹一下Java中的this作為返回值時(shí)返回。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

有時(shí)會(huì)遇到this作為返回值的情況,那么此時(shí)返回的到底是什么呢?

返回的是調(diào)用this所處方法的那個(gè)對(duì)象的引用,讀起來(lái)有點(diǎn)繞口哈,有沒(méi)有想起小學(xué)語(yǔ)文分析句子成份的試題,哈哈。

一點(diǎn)點(diǎn)分析的話,主干是“返回的是引用”;

什么引用呢?“那個(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)分析的話,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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java常見(jiàn)報(bào)錯(cuò)及解決方案總結(jié)

    java常見(jiàn)報(bào)錯(cuò)及解決方案總結(jié)

    這篇文章主要介紹了Java編程中常見(jiàn)錯(cuò)誤類(lèi)型及示例,包括語(yǔ)法錯(cuò)誤、空指針異常、數(shù)組下標(biāo)越界、類(lèi)型轉(zhuǎn)換異常、文件未找到異常、除以零異常、非法線程操作異常、方法未定義異常、死鎖和類(lèi)未找到異常,文中通過(guò)代碼將解決方案介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • SpringBoot3集成MyBatis詳解

    SpringBoot3集成MyBatis詳解

    MyBatis是一款開(kāi)源的持久層框架,它極大地簡(jiǎn)化了與數(shù)據(jù)庫(kù)的交互流程,MyBatis更具靈活性,允許開(kāi)發(fā)者直接使用SQL語(yǔ)句與數(shù)據(jù)庫(kù)進(jìn)行交互,本文將詳細(xì)介紹在Spring Boot項(xiàng)目中如何集成MyBatis,以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的輕松訪問(wèn)和操作,需要的朋友可以參考下
    2023-12-12
  • JAVA對(duì)象和字節(jié)數(shù)組互轉(zhuǎn)操作

    JAVA對(duì)象和字節(jié)數(shù)組互轉(zhuǎn)操作

    這篇文章主要介紹了JAVA對(duì)象和字節(jié)數(shù)組互轉(zhuǎn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • idea版本控制忽略.idea文件和.iml文件的問(wèn)題

    idea版本控制忽略.idea文件和.iml文件的問(wèn)題

    這篇文章主要介紹了idea版本控制忽略.idea文件和.iml文件,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • spring MVC cors跨域?qū)崿F(xiàn)源碼解析

    spring MVC cors跨域?qū)崿F(xiàn)源碼解析

    本文主要介紹了spring MVC cors跨域?qū)崿F(xiàn)源碼解析。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • Mybatis-Plus中分頁(yè)插件PaginationInterceptor的使用

    Mybatis-Plus中分頁(yè)插件PaginationInterceptor的使用

    我們?cè)陂_(kāi)發(fā)的過(guò)程中,經(jīng)常會(huì)遇到分頁(yè)操作,本文主要介紹了Mybatis-Plus中分頁(yè)插件PaginationInterceptor的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Data Source與數(shù)據(jù)庫(kù)連接池簡(jiǎn)介(JDBC簡(jiǎn)介)

    Data Source與數(shù)據(jù)庫(kù)連接池簡(jiǎn)介(JDBC簡(jiǎn)介)

    DataSource是作為DriverManager的替代品而推出的,DataSource 對(duì)象是獲取連接的首選方法,這篇文章主要介紹了Data Source與數(shù)據(jù)庫(kù)連接池簡(jiǎn)介(JDBC簡(jiǎn)介),需要的朋友可以參考下
    2022-11-11
  • Spring-boot 中@Async使用遇到的坑

    Spring-boot 中@Async使用遇到的坑

    這篇文章主要介紹了Spring-boot 中@Async使用的坑,首先使用@Async 需要在Spring啟動(dòng)類(lèi)上添加注解@EnableAsyn或者在你們線程池配置類(lèi)添加@EnableAsyn,需要的朋友可以參考下
    2024-01-01
  • springcloud集成nacos?使用lb?無(wú)效問(wèn)題解決方案

    springcloud集成nacos?使用lb?無(wú)效問(wèn)題解決方案

    這篇文章主要介紹了解決springcloud集成nacos?使用lb?無(wú)效,通過(guò)查看spring-cloud-starter-gateway?jar中的自動(dòng)配置類(lèi)的源碼,得知,該jar包中是不支持負(fù)載均衡的,需要引入spring-cloud-starter-loadbalancer?來(lái)支持,需要的朋友可以參考下
    2023-04-04
  • Struts2+Hibernate實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的方法

    Struts2+Hibernate實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的方法

    這篇文章主要介紹了Struts2+Hibernate實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的方法,結(jié)合實(shí)例形式分析了Struts2結(jié)合Hibernate實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的原理,步驟與相關(guān)實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2016-03-03

最新評(píng)論

县级市| 绥阳县| 安福县| 新疆| 汤阴县| 融水| 鄱阳县| 梓潼县| 黄大仙区| 徐水县| 盐池县| 墨脱县| 邵阳市| 江源县| 裕民县| 西平县| 中阳县| 东兰县| 枝江市| 哈尔滨市| 太原市| 阿克苏市| 枣阳市| 扎赉特旗| 平山县| 洪雅县| 商城县| 天气| 永德县| 上栗县| 和田市| 林甸县| 新兴县| 华池县| 祁东县| 榕江县| 长宁区| 烟台市| 玛多县| 阜平县| 彰武县|