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

溫馨提示×

溫馨提示×

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

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

this關鍵字如何在Java中使用

發布時間:2020-11-12 16:28:29 來源:億速云 閱讀:166 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關this關鍵字如何在Java中使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

我們通常在用Java中的this關鍵字的時候,都知道this是代表正在調用這個類的方法的當前實例。通常情況下理解this關鍵字還是很容易的,但是在我初學的時候,有一個疑問卻一直不能很清晰的理解,現在慢慢的理解了,就想把它記下來,也許有人和我有相同的疑問,說不定可以幫助到別人。我們還是先簡單的看看通常情況下this的作用吧。比如下面的代碼:

public class Leaf {
 private int i = 0;
 Leaf increment() {
  i++;
  return this;
 }
 void print() {
  System.out.println("i = " + i);
 }
 public static void main(String[] args) {
  Leaf x = new Leaf();
  x.increment().increment().print();
 }
}

在Leaf類的main方法中,我們new了一個Leaf實例 x,然后x實例調用increment()方法。如果increment()是普通的方法或者void方法,這個地方就沒有什么值得我們研究的了。特殊的是,在increment()方法中,我們return的是一個this,這個this代表的就是我們剛剛創建的x。因為x正在調用increment()方法,所以,increment()方法this就很明顯代表的是Leaf的x實例了。

     這看起來沒有什么可討論的,this就是代表的調用該方法的實例x。可是,假如我們把main()函數修改成下面的樣子

public static void main(String[] args) {
 Leaf x = new Leaf();
 x.increment().increment().print();
  
 Leaf y = new Leaf();
 y.increment().increment().print();
}

以上修改的代碼中,我們增加創建了一個Leaf實例y,然后y也連續調用調用了兩次increment()。現在問題來了,假如 x,y同時調用的increment()方法,那么this到底能代表誰呢?你可能會覺得這有什么問題,x調用increment()方法,this就代表x, y調用increment()方法,this就代表y。可問題是,當我們講調用方法的時候,在jvm層面上是找到Leaf類中increment()方法所在的內存地址,然后在java虛擬機棧中創建棧幀.

然后在棧幀中執行方法里面的代碼。現在看到了吧,也就是說,在jvm執行方法層面,沒有所謂的x調用,y調用了,那么,方法中的this到底是怎么確定指向哪個實例的呢?

      我們還是來看看Leaf類字節碼中是怎么展示的,是不是我們漏了什么,如果我們沒有把x實例或者y實例傳遞到方法里面去,那么,在jvm執行方法的時候,是不可能知道this具體指向哪個實例的。

到這里,我們看到在increment()方法中,編碼中沒有參數,但是在字節碼里面卻顯示參數個數為1,仔細想想,結果已經很明顯了:jvm在執行編譯的時候,在實例方法中,會默認隱藏的傳遞一個參數,這個參數就是當前調用的實例本身。比如x調用,隱藏就把x傳過去,y調用,就把y傳過去。所以,我們的this才能在jvm執行方法層面確定到底指向的是誰。

上面的結論是我們自己推斷出來的,有沒有那本書對這個有詳細的描述呢?《java編程思想》里面,對這塊是這樣描述的:

假定我們在一個方法的內部,并希望獲得當前對象的句柄。由于那個句柄是由編譯器“秘密”傳遞的,所以沒有標識符可用。然而,針對這一目的有個專用的關鍵字:this。

在里面講的這個編譯器秘密傳遞的句柄,就是我們這里的這個隱藏參數。

    到此為止,關于this的描述想必已經很清楚了,我們在jvm層面對它進行了理解。那么,各位有沒有興趣在看下下面的這個例子,想想這個基類B中的this代表了什么呢?

public class B {
 public B() {
  System.out.println(this.getClass().getSimpleName()); 
  System.out.println(((A) this).a); 
 }
}
public class A extends B {
 public int a = 100;  
 public A() {
  a = 200;
 } 
 public static void main(String[] args) {
  new A();
 }
}

這個例子原本是為了了解java具有繼承結構的時候類是怎么完成初始化的,可是這里面的B類中的構造函數比較特殊:B類中的構造函數中的this輸出的SimpleName是A。通常我們遇到的情況,B類中的this輸出的SimpleName應該是B,可是這里卻是A?為什么?

在上面我們講this的過程中,其實已經涉及到這塊了,在調用java方法創建棧幀的時候,jvm會秘密的傳遞一個當前實例。所以,當我們在執行A的構造函數的時候,默認會調用父類B的構造函數,在調用父類B構造函數的時候,秘密的傳進去的當前實例是 A的實例----因為是在A的構造函數中調用的B,所以,這個地方的this反而代表了A。

看完上述內容,你們對this關鍵字如何在Java中使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

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

AI

上栗县| 东平县| 大安市| 连山| 云安县| 东源县| 甘南县| 海南省| 临海市| 连州市| 曲松县| 金阳县| 前郭尔| 大名县| 郧西县| 鹤峰县| 通海县| 贵德县| 卓尼县| 海原县| 乐都县| 旅游| 榆中县| 承德县| 新巴尔虎右旗| 肥乡县| 天峻县| 海丰县| 彭泽县| 互助| 明溪县| 克东县| 西昌市| 崇明县| 若羌县| 兴国县| 临泽县| 承德市| 石台县| 昭觉县| 边坝县|