原始資料型別

Java 有 8 種原始資料型別,即 booleanbyteshortcharintlongfloatdouble。 (所有其他型別都是引用型別。這包括所有陣列型別,以及在 Java 語言中具有特殊意義的內建物件型別/類;例如 StringClassThrowable 及其子類。)

原始型別的所有操作(加法,減法,乘法等)的結果至少是 int,因此將 short 新增到 short 會產生 int,就像將 byte 新增到 byte,或者將 char 新增到 byte,或者將 char 新增到 char 。如果要將其結果分配回相同型別的值,則必須強制轉換它。例如

byte a = 1;
byte b = 2;
byte c = (byte) (a + b);

不轉換操作將導致編譯錯誤。

這是由於 Java 語言規範的以下部分,§2.11.1

編譯器使用 Java 虛擬機器指令對 byteshort 型別的文字值進行編碼,這些指令在編譯時或執行時將這些值簽名擴充套件為 int 型別的值。booleanchar 型別的文字值的載入使用在編譯時或執行時將文字零擴充套件為 int 型別的指令進行編碼。 [..]。因此,對實際型別 booleanbytecharshort 的值的大多數操作都是通過對計算型別 int 的值進行操作的指令正確執行的。

其背後的原因也在該部分中說明:

鑑於 Java 虛擬機器的單位元組操作碼大小,將編碼型別編碼到操作碼中會對其指令集的設計造成壓力。如果每個型別化指令都支援所有 Java 虛擬機器的執行時資料型別,則會有更多的指令,而不是在 byte 中表示的。 […]單獨的指令可用於根據需要在不支援和支援的資料型別之間進行轉換。