在 Java 程式設計中,每個變數都必須宣告其資料類型。Java 的資料類型主要分為兩大類別:基本類型與參考類型。基本類型是語言內建的,不屬於物件,主要為了執行效率而設計;參考類型則包含類別、介面、陣列等複雜資料結構。
基本類型包含 boolean 類型與數值類型。數值類型再細分為整數類型與浮點數類型:
byte、short、int、long、char(本質上是特殊的 int)float、double
Java 為基本類型提供語言層級支援,使用保留關鍵字表示。基本類型是單一值而非複雜物件,非面向物件設計,主要考量效能。同時提供包裝類別對應物件操作需求。
整數類型分別佔用 8、16、32、64、16 bits。整數類型的寬度定義的是變數或運算式的行為,而非記憶體佔用大小。JVM 可自由使用任何大小的記憶體空間,只要符合規範行為即可。
byte、short、int、long 皆為有號,採用二補數表示char 使用 16 位無號表示,對應 UTF-16 編碼集佔 1 位元組(8 bits),最小整數類型。適用於網路、檔案、IO 資料流處理以節省記憶體。取值範圍 [-128, 127],預設值 (byte)0。超出範圍賦值會編譯錯誤(如 byte b = 128)。
字面值陷阱:呼叫 test(byte b) 時傳入 test(0) 會編譯錯誤,因為 0 是 int 字面值,方法匹配優先 test(int)。但 byte b = 0 合法,因為賦值時會自動窄化轉換。
運算提升:byte 運算時自動提升為 int,需強制轉型回 byte:
byte s1 = 'a';
byte s2 = 'b';
byte sum = (byte)(s1 + s2); // 必須強制轉型
16 bits,範圍 [-2^15, 2^15-1]。較少使用,運算同樣提升為 int 或更高類型。
32 bits,範圍 [-2^31, 2^31-1]。有號二補數表示,常用於迴圈控制。Java 8+ 支援無號 32 位整數 [0, 2^32-1]。
64 bits,範圍 [-2^63, 2^63-1],預設值 0L。超大數值運算使用,不足時可用 BigInteger。
16 bits,範圍 [0, 65535],無號,預設 '\u0000'。Java 使用 Unicode 字元集,支援所有人類語言。支援算術運算(如 ch++),運算時轉為 int 需強制轉回。
char ch1 = 88; // 'X'
char ch2 = 'A'; // 65
ch2++; // 變成 'B' (66)
遵循 IEEE 754 標準:
f/F 後綴:float f = 10.0f;java.lang.Math 方法多用 double。高精度需求可用 BigDecimal。只有 true/false 兩值,預設 false。與數值 0 無關,不可相互轉換。
字面值是原始碼中固定值的表示方式,分類如下:
支援多進制表示:
10, -2000xFF, 0X1A077(數字 0-7)0b1010(JDK 7+)預設為 int 類型,加 L/l 為 long。int 字面值可自動窄化賦值給 byte/short/char(範圍內)。
float:加 f/F 後綴,如 11.8F, 1.23e-4Fdouble:預設或加 d/D,如 10.4, 1.23E3, 10D支援科學記號(E/e)。
'A', '\n'。支援跳脫序列(\uXXXX Unicode、\ddd 八進制)"Hello",可包含跳脫字元,需單行或用 + 連接null:可賦值給任何參考類型,表示無參考對象String.class, Integer.class 表示類型本身可在數字間插入底線提升可讀性:int x = 123_456_789;, float f = 1.22___33__44;。編譯時自動移除。限制:僅能分隔數字,不可開頭/結尾/小數點旁。
boolean 與其他 7 類型不可轉換。數值類型間可轉換,分自動(隱式)與強制(顯式)。
byte < (short = char) < int < long < float < double
小轉大自動完成。字面值賦值給 byte/short/char/long 也自動處理(即使目標比 int 小)。可能精度損失的情況:
int → floatlong → floatlong → doublefloat → double(無 strictfp 時)自動轉換不會拋出執行時例外。
大轉小或 short↔char 需強制轉型運算子 (type)。可能精度損失與數值大小變化(取模運算)。
int a = 256;
byte b = (byte)a; // b = 1 (256 % 256)
int c = 200;
byte d = (byte)c; // d = -56 (200 - 256)
浮點轉整數會截斷小數部分,超出範圍同樣取模。
int 字面值可賦值給 byte/short/char/int(範圍內)。long 字面值賦值給 byte 即使範圍內也需強制轉型byte/short/char 提升為 intlong 則整體提升為 long,同理 float、double
掌握 Java 基本資料類型的特性、取值範圍、轉換規則與字面值表示,是撰寫高效、正確 Java 程式的基礎。實際開發中應根據業務需求選擇適當類型,注意自動提升與強制轉換的邊界情況,避免精度損失與數值溢出錯誤。