电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:8日期: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
相關文章:
主站蜘蛛池模板: 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 冷凝锅炉_燃气锅炉_工业燃气锅炉改造厂家-北京科诺锅炉 | 西门子气候补偿器,锅炉气候补偿器-陕西沃信机电工程有限公司 | 钢格栅板_钢格板网_格栅板-做专业的热镀锌钢格栅板厂家-安平县迎瑞丝网制造有限公司 | 空压机网_《压缩机》杂志 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 杭州营业执照代办-公司变更价格-许可证办理流程_杭州福道财务管理咨询有限公司 | 骨龄仪_骨龄检测仪_儿童骨龄测试仪_品牌生产厂家【品源医疗】 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 冷却塔厂家_冷却塔维修_冷却塔改造_凉水塔配件填料公司- 广东康明节能空调有限公司 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 分子蒸馏设备(短程分子蒸馏装置)_上海达丰仪器 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | 运动木地板厂家,篮球场木地板品牌,体育场馆木地板安装 - 欧氏运动地板 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 不发火防静电金属骨料_无机磨石_水泥自流平_修补砂浆厂家「圣威特」 | HDPE储罐_厂家-山东九州阿丽贝防腐设备 | 100国际学校招生 - 专业国际学校择校升学规划 | 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 带压开孔_带压堵漏_带压封堵-菏泽金升管道工程有限公司 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 混合气体腐蚀试验箱_盐雾/硫化氢/气体腐蚀试验箱厂家-北京中科博达 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 旅游规划_旅游策划_乡村旅游规划_景区规划设计_旅游规划设计公司-北京绿道联合旅游规划设计有限公司 | 成都亚克力制品,PVC板,双色板雕刻加工,亚克力门牌,亚克力标牌,水晶字雕刻制作-零贰捌广告 | 上海质量认证办理中心| uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 一体化净水器_一体化净水设备_一体化水处理设备-江苏旭浩鑫环保科技有限公司 | 直流电能表-充电桩电能表-导轨式电能表-智能电能表-浙江科为电气有限公司 | 深圳宣传片制作-企业宣传视频制作-产品视频拍摄-产品动画制作-短视频拍摄制作公司 | 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 | 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 技德应用| 泵阀展|阀门展|水泵展|流体机械展 -2025上海国际泵管阀展览会flowtech china |