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

Java關(guān)鍵字this(動力節(jié)點Java學(xué)院整理)

 更新時間:2017年03月31日 09:37:59   投稿:mrr  
java中的this隨處可見,用法也多。通常情況下理解this關(guān)鍵字還是很容易的,但是在我初學(xué)的時候,有一個疑問卻一直不能很清晰的理解,現(xiàn)在慢慢的理解了,下面通過本文給大家記錄下,有需要的朋友參考下

我們通常在用Java中的this關(guān)鍵字的時候,都知道this是代表正在調(diào)用這個類的方法的當(dāng)前實例。通常情況下理解this關(guān)鍵字還是很容易的,但是在我初學(xué)的時候,有一個疑問卻一直不能很清晰的理解,現(xiàn)在慢慢的理解了,就想把它記下來,也許有人和我有相同的疑問,說不定可以幫助到別人。我們還是先簡單的看看通常情況下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實例調(diào)用increment()方法。如果increment()是普通的方法或者void方法,這個地方就沒有什么值得我們研究的了。特殊的是,在increment()方法中,我們return的是一個this,這個this代表的就是我們剛剛創(chuàng)建的x。因為x正在調(diào)用increment()方法,所以,increment()方法this就很明顯代表的是Leaf的x實例了。

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

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

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

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

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

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

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

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

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

    到此為止,關(guān)于this的描述想必已經(jīng)很清楚了,我們在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具有繼承結(jié)構(gòu)的時候類是怎么完成初始化的,可是這里面的B類中的構(gòu)造函數(shù)比較特殊:B類中的構(gòu)造函數(shù)中的this輸出的SimpleName是A。通常我們遇到的情況,B類中的this輸出的SimpleName應(yīng)該是B,可是這里卻是A?為什么?

在上面我們講this的過程中,其實已經(jīng)涉及到這塊了,在調(diào)用java方法創(chuàng)建棧幀的時候,jvm會秘密的傳遞一個當(dāng)前實例。所以,當(dāng)我們在執(zhí)行A的構(gòu)造函數(shù)的時候,默認會調(diào)用父類B的構(gòu)造函數(shù),在調(diào)用父類B構(gòu)造函數(shù)的時候,秘密的傳進去的當(dāng)前實例是 A的實例----因為是在A的構(gòu)造函數(shù)中調(diào)用的B,所以,這個地方的this反而代表了A。

以上所述是小編給大家介紹的Java關(guān)鍵字this(動力節(jié)點Java學(xué)院整理),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java中的FutureTask用法和原理解析

    Java中的FutureTask用法和原理解析

    本文深入剖析了Java并發(fā)編程中的FutureTask,包括其與Callable和Future的關(guān)系、使用方法以及內(nèi)部實現(xiàn)原理,FutureTask是Future的基礎(chǔ)實現(xiàn),用于處理異步計算結(jié)果,提供了任務(wù)執(zhí)行結(jié)果獲取和任務(wù)取消等方法
    2024-10-10
  • SpringBoot中實現(xiàn)數(shù)據(jù)脫敏處理的方法詳解

    SpringBoot中實現(xiàn)數(shù)據(jù)脫敏處理的方法詳解

    項目開發(fā)中,在處理敏感信息時,數(shù)據(jù)脫敏是一項重要的安全措施,本文主要為大家介紹了如何在SpringBoot項目中進行數(shù)據(jù)脫敏處理,有需要的可以了解下
    2025-03-03
  • RequestContextHolder.getRequestAttributes()空指針問題及解決

    RequestContextHolder.getRequestAttributes()空指針問題及解決

    這篇文章主要介紹了RequestContextHolder.getRequestAttributes()空指針問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 詳解Springboot集成sentinel實現(xiàn)接口限流入門

    詳解Springboot集成sentinel實現(xiàn)接口限流入門

    這篇文章主要介紹了詳解Springboot集成sentinel實現(xiàn)接口限流入門,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • springboot 2.x整合mybatis實現(xiàn)增刪查和批量處理方式

    springboot 2.x整合mybatis實現(xiàn)增刪查和批量處理方式

    這篇文章主要介紹了springboot 2.x整合mybatis實現(xiàn)增刪查和批量處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot之logback-spring.xml不生效的解決方法

    SpringBoot之logback-spring.xml不生效的解決方法

    這篇文章主要介紹了SpringBoot之logback-spring.xml不生效的解決方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 多模塊的springboot項目發(fā)布指定模塊的腳本方式

    多模塊的springboot項目發(fā)布指定模塊的腳本方式

    該文章主要介紹了如何在多模塊的SpringBoot項目中發(fā)布指定模塊的腳本,作者原先的腳本會清理并編譯所有模塊,導(dǎo)致發(fā)布時間過長,通過簡化腳本,只使用`mvn clean install`命令,可以快速發(fā)布指定模塊及其依賴的模塊
    2025-01-01
  • Java使用多線程批次查詢大量數(shù)據(jù)(Callable返回數(shù)據(jù))方式

    Java使用多線程批次查詢大量數(shù)據(jù)(Callable返回數(shù)據(jù))方式

    今天給大家分享Java使用多線程批次查詢大量數(shù)據(jù)(Callable返回數(shù)據(jù))方式,多線程有好幾種方式,今天說的方式比較好,實現(xiàn)Callable<> 這種方式能返回查詢的數(shù)據(jù),加上Future異步獲取方式,查詢效率大大加快,感興趣的朋友一起看看吧
    2023-11-11
  • Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(以ribbon為例)

    Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(以ribbon為例)

    這篇文章主要介紹了Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(以ribbon為例),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • springboot使用@value注入配置失敗的解決

    springboot使用@value注入配置失敗的解決

    這篇文章主要介紹了springboot使用@value注入配置失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

巴马| 宁夏| 富锦市| 新宁县| 大邑县| 黔江区| 石台县| 扎赉特旗| 桂林市| 海口市| 伊川县| 沾益县| 澄迈县| 平定县| 西贡区| 水富县| 武汉市| 阳泉市| 南陵县| 岫岩| 毕节市| 岳阳县| 曲靖市| 长阳| 二连浩特市| 荣昌县| 蓬溪县| 句容市| 青川县| 秦安县| 锦州市| 句容市| 潞城市| 游戏| 五莲县| 宜川县| 滨海县| 屏山县| 威宁| 克山县| 宁国市|