java的三大特性:繼承、封裝、多態(tài)。
1.運行時棧幀結構
每個棧幀包括:局部變量表、操作數(shù)棧、動態(tài)連接、方法返回地址和一些額外的附加信息。
棧幀中需要多大局部變量表以及多深的操作數(shù)棧在編譯代碼的時候就已經(jīng)確定了,并且寫入方法表的code屬性中。
局部變量表:存放方法參數(shù)和方法內部的局部變量。
操作數(shù)棧:后入先出棧。(用于暫存運算過程中的操作數(shù))
動態(tài)連接:字節(jié)碼中的方法調用指令都是以常量池中的符號引用作為參數(shù),這些引用若在類加載階段或第一次使用的時候就轉換為直接引用,這種轉換成為靜態(tài)解析。若在每一次運行期間轉化為直接引用,則為動態(tài)連接。每個棧幀都含有一個指向運行時常量池中該棧幀所屬方法的引用,為了支持方法調用過程中的動態(tài)連接。
2.方法調用
方法調用階段唯一任務是確定調用方法的版本,即確定調用哪個方法。
解析:類加載的解析階段,會將一部分符號引用轉化為直接引用。解析調用是靜態(tài)過程,編譯期間就確定。(靜態(tài)方法、私有方法、實例構造器<init>方法、父類方法)
分派dispatch:方法調用可能是靜態(tài)也可能是動態(tài)。靜態(tài)分派(method overload resolution重載),重載是通過靜態(tài)類型作為判定依據(jù)。動態(tài)分派:重寫,方法調用時根據(jù)對象的實際類型C查找C中是否存在相符的方法,若不存在,按照繼承順序從下往上的查找。
3.基于棧的字節(jié)碼解釋執(zhí)行引擎
java基本上是一種基于棧的指令集架構?;跅?yōu)點:可移植、代碼緊湊(每個字節(jié)對應一條指令,而多地址指令集中還需存放參數(shù))、編譯器實現(xiàn)簡單(無需考慮空間分配問題,都在棧上操作)缺點:執(zhí)行速度慢(頻繁出入棧)。基于寄存器的指令集:速度快
基于棧的解釋器執(zhí)行過程:
如:計算1+1,基于棧的指令集:
iconst_1? ? ? ? ? //將常量1放入操作數(shù)棧棧頂
iconst_1? ? ? ? ???//將常量1放入操作數(shù)棧棧頂
iadd? ? ? ? ? ? ? ? ?//將操作數(shù)棧中頭兩個元素出棧,做整型加法,然后結果2重新入棧。
istore_0? ? ? ? ? //把棧頂值放入到局部變量表的第0個slot中