在 C/C++ 中,int、long 等型別的大小會隨編譯器與硬體架構而異(16/32/64 位元)。Java 採取截然不同的策略:由 Java 虛擬機(JVM)統一定義所有基本型別的大小、範圍與行為。無論 JVM 運行於 Windows、Linux、macOS 或嵌入式裝置,int 永遠是 32 位元有號整數,double 永遠遵循 IEEE 754 雙精度標準。這是「Write Once, Run Anywhere」的基石之一。
Java 基本型別分為四大類別:整數、浮點數、字元、布林值。它們不是物件,佔用固定記憶體,存取速度最快。
| 類別 | 型別 | 大小 | 範圍 / 精度 | 預設值 |
|---|---|---|---|---|
| 整數 | byte |
1 位元組 (8 bits) | -128 ~ 127 | 0 |
short |
2 位元組 (16 bits) | -32,768 ~ 32,767 | 0 | |
int |
4 位元組 (32 bits) | -2,147,483,648 ~ 2,147,483,647 | 0 | |
long |
8 位元組 (64 bits) | -9.22×10¹⁸ ~ 9.22×10¹⁸ | 0L | |
| 浮點數 | float |
4 位元組 (32 bits) | IEEE 754 單精度 (約 6-7 位有效數字) | 0.0f |
double |
8 位元組 (64 bits) | IEEE 754 雙精度 (約 15 位有效數字) | 0.0d | |
| 字元 | char |
2 位元組 (16 bits) | Unicode 字元集 (U+0000 ~ U+FFFF) | '\u0000' |
| 布林值 | boolean |
1 位元 (JVM 實作通常佔 1 位元組) | true / false | false |
Java 無 unsigned 關鍵字。byte 範圍為 -128~127 而非 0~255。若需處理無號資料,需用較大型別(如 int)配合位元運算。
boolean 不能與任何其他型別互轉(含數值、字元)sizeof 運算子因型別大小固定且禁止直接記憶體存取,Java 移除 sizeof。如需得知大小,查表即可。
為了在集合框架、泛型、反射等物件導向場景使用基本值,Java 提供八個對應的不可變封裝類別:
Byte、Short、Integer、Long、Float、Double 繼承自 NumberCharacter、Boolean 直接繼承 Object// 字串 → 基本型別 (靜態工廠方法)
int i = Integer.parseInt("123");
double d = Double.valueOf("3.14"); // 回傳 Double 物件
// 基本型別 → 字串
String s = Integer.toString(456);
// 物件 → 其他基本型別 (多型)
Number n = Integer.valueOf(100);
double d = n.doubleValue(); // 100.0
// 自動裝箱/拆箱 (Java 5+)
Integer obj = 100; // 裝箱
int val = obj; // 拆箱
頻繁裝箱/拆箱會產生大量暫時物件,增加 GC 壓力。效能敏感的迴圈、大量運算建議直接使用基本型別。
| 宣告位置 | 是否自動初始化 | 未顯式賦值時的值 | 編譯器檢查 |
|---|---|---|---|
| 類成員變數 (Instance/Static Field) | 是 | 對應型別預設值 (0, false, null) | 無錯誤 |
| 方法區域變數 (Local Variable) | 否 | 不可用 (佔位但無值) | 編譯錯誤:「variable might not have been initialized」 |
最佳實務: 區域變數宣告時務必立即賦值,或在所有執行路徑使用前確保已賦值。
public class PrimitiveDemo {
// 成員變數 - 自動初始化
boolean b;
byte by;
short s;
int i;
long l;
char c;
float f;
double d;
public void testLocal() {
int localInt; // 未初始化
// System.out.println(localInt); // 編譯錯誤!
localInt = 10; // 必須先賦值
System.out.println("localInt = " + localInt);
}
public static void main(String[] args) {
PrimitiveDemo demo = new PrimitiveDemo();
System.out.println("boolean: " + demo.b); // false
System.out.println("byte: " + demo.by); // 0
System.out.println("char: [" + demo.c + "]"); // 空白 (\\u0000)
System.out.println("double: " + demo.d); // 0.0
demo.testLocal();
}
}
boolean 獨立於數值體系,不可互轉