題目一
public static void main(String[] args) {
byte b1 = 1, b2 = 2, b3, b6, b8;
final byte b4 = 4, b5 = 6, b7;
b3 = b1 + b2;// 語句1
b6 = b4 + b5; // 語句2
b8 = b1 + b4; // 語句3
b7 = b2 + b5; // 語句4
System.out.println(b3 + b6);
}
上述代碼片段中,存在編譯錯誤的語句是(ACD)
A語句1 B語句2 C語句3 D語句4
剖析
-
語句1錯誤:b3 = b1 + b2;
b1,b2均為byte自動轉int,b3作為byte類型無法接受int類型的值,所以正確寫法為b3=(byte)(b1+b2);或將b3定義為int; -
語句2正確,b6 = b4 + b5;b4和b5為final類型不會自動提升,所以和的類型視左邊變量類型而定,即b6是可以任意數值類型
-
語句3錯誤:b8 = b1 + b4;雖然b4不會自動提升,但b1仍會自動提升,所以結果需要強轉,b8=(byte)(b1+b4)
-
語句4錯誤:b7 = b2 + b5;原理同語句3,所以錯誤。同時大家要注意b7是final修飾,即只可賦值一次,便不可再改變。
本題主要是涉及到以下幾個知識點
- 自動轉型
- 表示數范圍小的數據類型可以自動轉換為表示數范圍大的數據類型;
- 所有的byte,short,char型的值在操作時將被提升為int型
- final修飾的變量如何轉型
- 被final修飾的變量不會自動改變類型,當2個final修飾相操作時,結果會根據左邊變量的類型而轉化