91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺談Java中的this作為返回值時返回的是什么

發布時間:2020-09-19 18:02:33 來源:腳本之家 閱讀:136 作者:蟬蟬 欄目:編程語言

有時會遇到this作為返回值的情況,那么此時返回的到底是什么呢?

返回的是調用this所處方法的那個對象的引用,讀起來有點繞口哈,有沒有想起小學語文分析句子成份的試題,哈哈。

一點點分析的話,主干是“返回的是引用”;

什么引用呢?“那個對象的引用”;

哪個對象呢?“調用方法的那個對象”;

調用的哪個方法呢?“調用的是this所位于的方法”;這樣就清楚了。

再總結一下就是,this作為返回值時,返回的是調用某方法的對象的引用,這個方法正是包含“return this;”這行命令的那個方法;更簡單點說,就是誰調用返回的就是誰。

為了更清楚、直觀的理解問題,下面以簡單的例子說明。

包human中定義了Person類,代碼如下:

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指向的對象沒有改變,仍與per2指向同一個對象");
  else
   System.out.println("per1指向的對象已改變,與per2指向不同的對象");
  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("調用reThis3之前,per1.name=" + per1.name);
  per1 = per1.reThis3();
  System.out.println("調用reThis3之后,per1.name=" + per1.name);
 }
}

輸出結果如下:

reThis1 per:lu
per1指向的對象沒有改變,仍與per2指向同一個對象
per1:liu
per2:liu
reThis1 per:lu
reThis2 per:liu
per1指向的對象沒有改變,仍與per2指向同一個對象
per1:liu
per2:liu
調用reThis3之前,per1.name=liu
調用reThis3之后,per1.name=ma

逐句分析執行過程:

(1).第1句:Person per1 = new Person("liu","female");

創建一個Person對象,將name初始化為“liu”,gender初始化為“female”,并讓per1指向該對象。

(2).第2句:Person per2 = per1;

定義一個Person類的對象引用,并與per1指向同一個對象;具體內存分配見圖1:

淺談Java中的this作為返回值時返回的是什么

(3).第3句:per1 = per1.reThis1();

由per1調用reThis1()方法,并將返回值賦給per1;reThis1()方法體內定義了一個局部變量per,并創建一個對象,由per指向它;具體內存分配見圖2:

淺談Java中的this作為返回值時返回的是什么

緊接著輸出reThis1 per:lu;最后返回this,并把返回的值賦給per1。

(4).第4句:Person.equRefer(per1, per2);

調用equRefer(per1,per2)來驗證per1的值并未改變;根據下面的輸出結果也可知per1仍與per2指向原來的對象,也就是說此時this的值與per1的值是一致的;也可以說,誰調用的返回的就是誰。

輸出結果:

per1指向的對象沒有改變,仍與per2指向同一個對象
per1:liu
per2:liu

此時的內存圖如圖3:

淺談Java中的this作為返回值時返回的是什么

(5).第5句:per1 = per1.reThis2();

per1調用reThis2(),由(4)可推測,此時per1的值也不會變,是由per1調用的this所處的方法,所以返回的也是per1;具體來分析的話,reThis2()定義了一個局部變量per,并給其賦值為reThis1(),也就是說reThis2()調用了reThis1(),由(3)、(4)可推知,此時的內存結構是下面這樣的:

淺談Java中的this作為返回值時返回的是什么

局部變量per指向的對象與per1是一致的,因為調用reThis1的對象是per1所指的對象,所以返回值也是per1。

此處的輸出結果為:

reThis1 per:lu
reThis2 per:liu

(6).第6句:Person.equRefer(per1, per2);

驗證上面的結論,per1指向沒變,此時的內存分配圖如圖4所示:

淺談Java中的this作為返回值時返回的是什么

(7).第7、8、9句:

System.out.println("調用reThis3之前,per1.name=" + per1.name);
per1 = per1.reThis3();
System.out.println("調用reThis3之后,per1.name=" + per1.name);

per1調用reThis3();reThis3()中修改了namer的值,由"liu"改為"ma",然后返回this。

調用前后的內存結構分別如圖6、圖7所示:

淺談Java中的this作為返回值時返回的是什么

淺談Java中的this作為返回值時返回的是什么

輸出結果:

調用reThis3之前,per1.name=liu
調用reThis3之后,per1.name=ma

再一次驗證了上述的結論。

關于為什么使用this,我是這么理解的:由于定義類的時候尚未創建對象,所以不能確定對象到底叫什么,就用this來統一表示,等到具體調用時就可以知道對象的名字了,然后就用對象的引用替換this;所以為了便于記憶,可以理解成誰調用返回的就是誰。

至于返回this有什么意義,我的理解是:記返回this的方法為A,可能A的方法體中對對象的屬性做了某些操作或調用了某些方法完成了某些動作,總之,做完這些操作后就把原對象的引用返回,返回后的狀態是對象最新的狀態,可能與對象調用方法A前不同。

以上這篇淺談Java中的this作為返回值時返回的是什么就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

雅江县| 临澧县| 法库县| 蚌埠市| 外汇| 重庆市| 彰化县| 铁力市| 义马市| 牡丹江市| 临城县| 马边| 甘孜县| 固始县| 阿拉善右旗| 武城县| 岚皋县| 增城市| 大城县| 宝兴县| 通辽市| 南安市| 中山市| 且末县| 晋城| 洞口县| 宜宾县| 姚安县| 肇州县| 福州市| 巴东县| 重庆市| 沁源县| 云阳县| 白河县| 铅山县| 许昌县| 利川市| 汾阳市| 博客| 马龙县|