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語言規範以前我使用javap命令反彙編了測試程序,發現有個i2s指令(我想這就是int類型轉換爲short類型的指令了!)
附:javap -c filename.class //filename替換爲你本身的class文件名就能夠反彙編class文件,看裏面的指令了哦!