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

Java中為什么this可以調(diào)用當前實例

 更新時間:2021年07月25日 16:17:32   作者:程序員小潘  
本文主要介紹了為什么可以通過this關(guān)鍵字訪問到當前對象呢,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

1. 前言

在剛開始學習Java的時候,大家肯定都接觸過this關(guān)鍵字,尤其是在構(gòu)造函數(shù)賦值的時候,如下示例:

public class Person {
 private String name;
 private int age;

 public Person(String name, int age) {
  // 必須加this關(guān)鍵字,否則無法完成成員變量的賦值
  this.name = name;
  this.age = age;
 }
}

在構(gòu)造函數(shù)中,如果成員變量名稱和參數(shù)名稱相同時,必須加this關(guān)鍵字,否則你只是將參數(shù)name賦值給它本身,并沒有賦值給Person.name,因為局部變量的優(yōu)先級高于成員變量。一旦加上this關(guān)鍵字,由于this指向的是當前實例,就可以完成對象的成員變量賦值。

那為什么可以通過this關(guān)鍵字訪問到當前對象呢?

2. 棧幀

要弄清這個問題,首先要了解JVM在執(zhí)行方法時,方法棧的棧幀結(jié)構(gòu)。

Java虛擬機以【方法】作為最基本的運行單元,【棧幀】就是用于支持JVM進行方法調(diào)用背后的數(shù)據(jù)結(jié)構(gòu),它也是JVM運行時數(shù)據(jù)區(qū)中【虛擬機棧】中的棧元素。

簡單點說,方法的執(zhí)行過程可看作是一個個棧幀從入棧到出棧的過程。

棧幀中存儲了方法的:局部變量表、操作數(shù)棧、動態(tài)連接和方法返回地址等信息。

當使用javac程序?qū)⒃创a編譯成字節(jié)碼后,一個方法的棧幀需要多大的局部變量表,多深的操作數(shù)棧就已經(jīng)被計算出來,并且寫入到方法表的【Code】屬性中了,這一切和程序運行時無關(guān)。

換言之,一個方法它有多少個局部變量,在編譯時就已經(jīng)確定,不會隨著程序的運行而改變。今天我們要探究的【this】問題,就在方法棧的局部變量表中。

3. 分析

我們?nèi)匀挥胘avap命令來分析編譯后的Class文件,這是最有說服力的。

public class Person {

 public void say() {

 }

 public static void staticSay() {
  
 }
}

如上一段代碼,分別有一個實例方法和靜態(tài)方法,我們已經(jīng)知道,在靜態(tài)方法中,是無法訪問【this】的,但是在實例方法中可以。

先javac Person.java再javap -verbose Person,得到的信息有點長,我只貼這兩個方法的信息。

public void say();
descriptor: ()V
flags: ACC_PUBLIC
Code:
  stack=0, locals=1, args_size=1
  0: return
  LineNumberTable:
 line 8: 0

public static void staticSay();
descriptor: ()V
flags: ACC_PUBLIC, ACC_STATIC
Code:
  stack=0, locals=0, args_size=0
  0: return
  LineNumberTable:
 line 12: 0

重點關(guān)注【Code】那一欄,say()有一個局部變量,有一個參數(shù)。staticSay()沒有局部變量,也沒有參數(shù)。

是不是感到很疑惑?say()方法形參是空的,方法體也是空的,為什么編譯后會顯示它有一個局部變量和一個形參呢?

其實,對于實例方法而言,它至少有一個參數(shù)和一個局部變量,那就是當前對象。JVM在調(diào)用對象的實例方法時,會將對象本身的引用作為第0號參數(shù)傳遞過去,這樣你就可以通過this關(guān)鍵字訪問到對象本身了,其實也就是訪問第0個參數(shù)而已。

如下,這兩個方法其實是等價的。

public void say(Person this, String text) {
    System.out.println(text);
}

public void say(String text) {
    System.out.println(text);
}

4. 總結(jié)

Java虛擬機在執(zhí)行方法時,會將方法打包成一個【棧幀】,棧幀中有【局部變量表】,參數(shù)也是局部變量表的一部分,一個方法的局部變量表有多大在編譯時就已經(jīng)確定,不會隨著程序的運行而改變。
對于實例方法而言,在編譯時會自動加上一個隱藏的0號參數(shù),就是當前類。JVM在調(diào)用對象的實例方法時,會自動將對象引用作為第0號參數(shù)傳遞過去,訪問【this】其實就是訪問第0號參數(shù)。

到此這篇關(guān)于Java中為什么this可以調(diào)用當前實例的文章就介紹到這了,更多相關(guān)Java this調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • java對象初始化順序驗證示例

    java對象初始化順序驗證示例

    以下這段小程序?qū)φ{(diào)用對象構(gòu)造函數(shù)時,父類構(gòu)造函數(shù)、成員變量初始化函數(shù),以及非靜態(tài)初始化塊調(diào)用順序進行驗證,不考慮靜態(tài)成員及靜態(tài)初始化塊
    2014-02-02
  • 學習spring事務(wù)與消息隊列

    學習spring事務(wù)與消息隊列

    這篇文章主要為大家詳細介紹了spring事務(wù)與消息隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • SpringMVC 限流的示例代碼

    SpringMVC 限流的示例代碼

    這篇文章主要介紹了SpringMVC 限流的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 使用HTTPclient保持長連接

    使用HTTPclient保持長連接

    這篇文章主要介紹了使用HTTPclient保持長連接,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • springboot后臺session的存儲與取出方式

    springboot后臺session的存儲與取出方式

    這篇文章主要介紹了springboot后臺session的存儲與取出方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java泛型通配符的使用詳解

    Java泛型通配符的使用詳解

    本文主要介紹了Java泛型通配符的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • SpringMVC處理數(shù)據(jù)輸出的實例代碼

    SpringMVC處理數(shù)據(jù)輸出的實例代碼

    這篇文章主要給大家介紹了關(guān)于SpringMVC處理數(shù)據(jù)輸出的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • 使用原生JDBC動態(tài)解析并獲取表格列名和數(shù)據(jù)的方法

    使用原生JDBC動態(tài)解析并獲取表格列名和數(shù)據(jù)的方法

    這篇文章主要介紹了使用原生JDBC動態(tài)解析并獲取表格列名和數(shù)據(jù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Java依賴-關(guān)聯(lián)-聚合-組合之間區(qū)別_動力節(jié)點Java學院整理

    Java依賴-關(guān)聯(lián)-聚合-組合之間區(qū)別_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java依賴-關(guān)聯(lián)-聚合-組合之間區(qū)別理解,依賴關(guān)系比較好區(qū)分,它是耦合度最弱的一種,下文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2017-08-08
  • JPA如何使用findBy方法自定義查詢

    JPA如何使用findBy方法自定義查詢

    這篇文章主要介紹了JPA如何使用findBy方法自定義查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

连南| 定日县| 陵水| 繁昌县| 抚顺市| 濮阳县| 洪洞县| 凤山县| 梁平县| 曲阳县| 交口县| 巴塘县| 锡林浩特市| 连州市| 辽宁省| 朔州市| 奎屯市| 吕梁市| 寻乌县| 历史| 梓潼县| 东辽县| 吕梁市| 娄烦县| 常德市| 郑州市| 江城| 项城市| 中卫市| 呼伦贝尔市| 云安县| 阳新县| 抚州市| 开封县| 德州市| 台东市| 聂荣县| 平泉县| 皮山县| 朔州市| 永登县|