1.編譯器的常量優(yōu)化
在給變量進(jìn)行賦值的時候蒂秘,如果右側(cè)的表達(dá)式當(dāng)中全部是常量,沒有任何變量夷野,
? ? ????例如:short num = 1 + 11;? // 等號右邊全都是常量滑蚯,沒有任何變量參與運算
那么編譯器javac將會直接計算出右側(cè)的運算結(jié)果皱碘,并賦給左側(cè)變量。
編譯之后,得到的class字節(jié)碼中相當(dāng)于如下的語句:
? ????? short num = 12;? // 右側(cè)的常量結(jié)果沒有超過左側(cè)定義的數(shù)值范圍,所以正確辈挂。
注意:一旦右側(cè)表達(dá)式中有變量參與,那么這種優(yōu)化就不會進(jìn)行了裹粤。
2.數(shù)據(jù)類型“隱式強制”轉(zhuǎn)換
對于byte终蒂、short、char三種數(shù)據(jù)類型來說遥诉,初始化賦值時為:
? ? ? ? byte b1 = 1;
? ? ? ? short s2 = 2;
? ? ? ? char c3 = 3;
此時拇泣,右側(cè)本質(zhì)上是一個int,
而將一個int賦值給byte矮锈、short霉翔、char時,應(yīng)該進(jìn)行強制類型轉(zhuǎn)換苞笨,如
? ???????byte b1 = (byte) 1;
????????short s2 = (short) 2;
? ? ? ? char c3 = (char) 3;
但是在定義這三種類型時债朵,我們一般采用前者子眶,而不采用后者。
一方面是因為前者書寫量少葱弟,
另一方面是因為對于byte壹店、short猜丹、char三種類型來說芝加,定義時當(dāng)右側(cè)數(shù)值沒有超過范圍,那么javac編譯器會自動隱含的幫我們補上(byte)射窒、(short)藏杖、(char)
注意:1. 右側(cè)的數(shù)值未超過左側(cè)的范圍時,編譯器自動補上強轉(zhuǎn)脉顿。
? ? ? ? ? ?2.?右側(cè)的數(shù)值超過了左側(cè)的范圍時蝌麸,編譯器直接報錯。