閒來無事,關於short s=1;short=s+1;和short+=1;問題的探索。

short s=1;  //1
s=s+1;      //2
這段代碼不能經過編譯,執行第2行代碼的時候,系統會把s+1的結果轉換爲int類型,而s是short類型,比int類型小。須要強制進行轉換爲short才能夠經過編譯。(通常損失精度的轉換都要採用強制的,就像這樣:s=(short)(s+1);)

short s1=1; //1
s+=1;       //2

這裏的第二行代碼能夠正常編譯,緣由是在使用複合賦值運算符(這裏指:+=)時,類型之間的轉換是自動的不須要手動參與。
    至於運算符:+=爲何能夠進行自動轉換?
    猜想:由於在重載的過程當中加入了類型轉換的代碼。...

後來參看了,《java語言規範》在15.26.2 Compound Assignment Operators 一節說明了這個問題,
+=就至關於 s=(short)(s+1);   //就像我上面猜想的那樣。
附:java語言規範文檔下載地址: http://docs.oracle.com/javase/specs/

其實在看java語言規範以前我使用javap命令反彙編了測試程序,發現有個i2s指令(我想這就是int類型轉換爲short類型的指令了!)
附:javap -c filename.class  //filename替換爲你本身的class文件名就能夠反彙編class文件,看裏面的指令了哦!
相關文章
相關標籤/搜索