国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Java中為什么this可以調用當前實例

瀏覽:4日期:2022-08-08 17:28:44
目錄1. 前言2. 棧幀3. 分析4. 總結1. 前言

在剛開始學習Java的時候,大家肯定都接觸過this關鍵字,尤其是在構造函數賦值的時候,如下示例:

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

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

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

2. 棧幀

要弄清這個問題,首先要了解JVM在執行方法時,方法棧的棧幀結構。

Java虛擬機以【方法】作為最基本的運行單元,【棧幀】就是用于支持JVM進行方法調用背后的數據結構,它也是JVM運行時數據區中【虛擬機棧】中的棧元素。

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

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

Java中為什么this可以調用當前實例

當使用javac程序將源碼編譯成字節碼后,一個方法的棧幀需要多大的局部變量表,多深的操作數棧就已經被計算出來,并且寫入到方法表的【Code】屬性中了,這一切和程序運行時無關。

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

3. 分析

我們仍然用javap命令來分析編譯后的Class文件,這是最有說服力的。

public class Person { public void say() { } public static void staticSay() { }}

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

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

public void say();descriptor: ()Vflags: ACC_PUBLICCode: stack=0, locals=1, args_size=1 0: return LineNumberTable: line 8: 0public static void staticSay();descriptor: ()Vflags: ACC_PUBLIC, ACC_STATICCode: stack=0, locals=0, args_size=0 0: return LineNumberTable: line 12: 0

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

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

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

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

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

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

到此這篇關于Java中為什么this可以調用當前實例的文章就介紹到這了,更多相關Java this調用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 国产美女午夜精品福利视频 | 国产精品资源在线 | 国产欧美一区视频在线观看 | 99视频网| 欧美精品久久久亚洲 | 久久综合中文字幕一区二区三区 | 欧美一级视频免费看 | 久久99热只有视精品6国产 | 99久久免费国产精精品 | 一区二区三区日本视频 | 偷拍第1页| 国产一区二区三区视频在线观看 | 韩国一级做a爰片性色毛片 韩国一区在线 | 91在线免费观看网站 | 国产日韩精品一区在线观看播放 | 亚洲欧美高清 | 成免费网站| 欧美日本一区二区三区道 | 国产在线更新 | 欧美三级三级三级爽爽爽 | 久久999视频 | 久久国产午夜精品理论片34页 | 久草中文网 | 成人高清视频在线观看 | 日本巨乳中文字幕 | 国产精品黄页在线播放免费 | 美女拍拍拍爽爽爽爽爽爽 | 在线观看国产一区 | 欧美一级大片在线观看 | 99视频九九精品视频在线观看 | 国产女人伦码一区二区三区不卡 | 在线中文字幕亚洲 | www.亚洲国产 | 国产成人精品999在线观看 | 亚洲欧美卡通成人制服动漫 | 亚洲男人的天堂成人 | 真人一级毛片免费完整视 | 久久精品国产亚洲片 | 久久福利精品 | 日韩一级欧美一级在线观看 | 欧美一级香蕉毛片 |