2 回答

TA貢獻(xiàn)1809條經(jīng)驗 獲得超8個贊
請參閱 JVM 規(guī)范,§2.11.1。類型和 Java 虛擬機(jī):
請注意,表 2.11.1-A中的大多數(shù)指令沒有整數(shù)類型
byte
、char
和 的形式short
。沒有一個具有該boolean
類型的形式。編譯器對大量類型的文字值進(jìn)行編碼byte
,并使用 Java 虛擬機(jī)指令在編譯時或運(yùn)行時short
將這些值符號擴(kuò)展為類型值。int
加載類型的文字值boolean
并使用在編譯時或運(yùn)行時char
將文字零擴(kuò)展為類型值的指令進(jìn)行編碼。int
同樣,從boolean
、 、byte
、short
和類型的值數(shù)組加載char
,使用 Java 虛擬機(jī)指令進(jìn)行編碼,這些指令將值符號擴(kuò)展或零擴(kuò)展為類型值int
.?因此,大多數(shù)對實(shí)際類型boolean
、byte
、char
和的值的操作short
都由對計算類型 的值進(jìn)行操作的指令正確執(zhí)行int
。
值得回顧的是,在 Java 中,任何不涉及的整數(shù)算術(shù)long
都會有int
結(jié)果,無論輸入是byte
、char
、short
、 或int
。
所以一行像
short?i?=?1,?j?=?2,?k?=?i?+?j;
不會編譯,但需要類型轉(zhuǎn)換,比如
short?i?=?1,?j?=?2,?k?=?(short)(i?+?j);
這種類型轉(zhuǎn)換將是唯一short
涉及的指示器。撇開調(diào)試提示不談,字節(jié)碼中沒有局部變量的正式聲明,只有確定其類型的值賦值。所以類型的局部變量short
根本不存在。上面的代碼編譯為
? ? ?0: iconst_1
? ? ?1: istore_1
? ? ?2: iconst_2
? ? ?3: istore_2
? ? ?4: iload_1
? ? ?5: iload_2
? ? ?6: iadd
? ? ?7: i2s
? ? ?8: istore_3
這與編譯形式相同
int i = 1, j = 2, k = (short)(i + j);
但請注意,變量的編譯時類型可以更改編譯器在重載時選擇調(diào)用的方法。print(boolean)如果類型具有不同的語義(例如or的情況),這一點(diǎn)尤其重要print(char)。雖然傳遞給該方法的值int在這兩種情況下都有類型,但結(jié)果卻完全不同。
編譯器強(qiáng)制執(zhí)行的差異的另一個示例是
{
? ? int i = 1;
? ? i++;
}
{
? ? short s = 1;
? ? s++;
}
其被編譯為
? ? ?0: iconst_1
? ? ?1: istore_1
? ? ?2: iinc? ? ? ? ? 1, 1
? ? ?5: iconst_1
? ? ?6: istore_1
? ? ?7: iload_1
? ? ?8: iconst_1
? ? ?9: iadd
? ? 10: i2s
? ? 11: istore_1
因此,由于計算始終以 32 位執(zhí)行,因此編譯器插入必要的代碼以將結(jié)果截斷為short第二次遞增。再次注意沒有變量聲明,因此代碼與編譯后的形式相同
int i = 1;
i++;
i = 1;
i = (short)(i+1);
驗證類型系統(tǒng)也值得一看,因為驗證者將檢查所有從局部變量到局部變量的傳輸?shù)挠行裕?/p>
類型檢查器基于驗證類型的層次結(jié)構(gòu)強(qiáng)制執(zhí)行類型系統(tǒng),如下所示。
Verification?type?hierarchy: ?????????????????????????????top ???????????????????????____________/\____________ ????????????????/??????????????????????????\ ???????????????/????????????????????????????\ ????????????oneWord???????????????????????twoWord ???????????/???|???\?????????????????????/???????\ ??????????/????|????\???????????????????/?????????\? ????????int??float??reference?????????????????long????????double ?????????????????????/?????\ ????????????????????/???????\_____________ ???????????????????/??????????????????????\ ??????????????????/????????????????????????\ ???????????uninitialized????????????????????+------------------+ ????????????/?????????\?????????????????????|??Java?reference??| ???????????/???????????\????????????????????|??type?hierarchy??| uninitializedThis??uninitialized(Offset)????+------------------+?? ?????????????????????????????????????????????????????| ?????????????????????????????????????????????????????|????????????????????????????????????????????????????null
因此,與 Java 語言類型相比,類型系統(tǒng)得到了簡化,并且驗證器不會介意,例如,如果您將值傳遞boolean
給需要 a 的方法char
,因為兩者都是int
類型。
添加回答
舉報