Java 是強型別語言,變數必須先宣告型別才能使用。本文詳細拆解八大基本型別的位元寬度、取值範圍、字面值寫法,並透過實例講解自動型別提升、強制轉型精度損失、補碼表示等核心知識點,幫你建立精準的型別思維。
| 分類 | 型別 | 位元/位元組 | 預設值 | 取值範圍 / 說明 |
|---|---|---|---|---|
| 整數 | byte | 8 bit / 1 B | 0 | -128 ~ 127 |
| short | 16 bit / 2 B | 0 | -32,768 ~ 32,767 | |
| int | 32 bit / 4 B | 0 | -2^31 ~ 2^31-1 (約 ±21 億) | |
| long | 64 bit / 8 B | 0L | -2^63 ~ 2^63-1,字面值需加 L | |
| 浮點 | float | 32 bit / 4 B | 0.0f | 單精度,字面值需加 F,有效位數 6-7 位 |
| double | 64 bit / 8 B | 0.0 | 雙精度,預設浮點型別,有效位數 15 位 | |
| 字元 | char | 16 bit / 2 B | '\u0000' | Unicode 字元,單引號包裹 'A'、'中' |
| 布林 | boolean | 1 bit (JVM 實作通常 1 B) | false | 僅 true / false,不參與運算 |
// 格式:型別 變數名 = 初始值;
int age = 25;
double price = 99.9;
char grade = 'A';
boolean isPass = true;
// 同型別多變數宣告(建議分行寫)
int x = 1, y = 2; // 可讀性較差,不推薦
「小型別 → 大型別」自動發生,無精度損失風險:
byte b = 10;
int i = b; // 自動提升
double d = i; // 自動提升
// 運算中自動提升至 int 以上
byte a = 2, b = 3;
int sum = a + b; // byte 參與運算先提升為 int
// byte result = a + b; // 編譯錯誤:int 無法自動縮小為 byte
「大型別 → 小型別」需程式設計師負責,可能截斷高位導致精度損失或符號改變:
int i = 130;
byte b = (byte) i; // 結果 -126(補碼截斷)
double d = 3.14;
int n = (int) d; // 結果 3,小數部份直接捨棄
byte/short/char 變數賦值編譯期常量且在範圍內,可隱式縮小:byte b = 100; ✅byte b = (byte) 200; ⚠️ 結果 -56float f = 1.23; ❌ 編譯錯誤,須 1.23Flong l = 12345678901; ❌ 編譯錯誤,須 12345678901LJava 使用補碼儲存有號整數:
// byte 儲存 -126 過程
130 的 int 補碼:0000...1000 0010
截取低 8 位: 1000 0010 (補碼)
反碼: 1000 0001
原碼: 1111 1110 = -126
char 本質是無號 16 位整數,可直接參與整數運算:
char c = 'A'; // 65
char next = c + 1; // 'B' (66)
System.out.println('B' + 'e' + 'i'); // 664 (整數加法)
但 boolean 完全不參與任何算術運算。
float f = 3.14; → ✅ float f = 3.14F;long l = 10000000000; → ✅ long l = 10000000000L;float/double,改用 BigDecimal。int、double,特定場景(網路傳輸、檔案格式)再用 byte/short。掌握八大基本型別的位元寬度、字面值規則、自動提升與強制轉換邏輯,是寫出無 Bug、高效能 Java 程式的前提。下一步建議:實作「型別轉換測試類」,觀察各種邊界值(Byte.MAX_VALUE、Integer.MIN_VALUE 等)轉換前後的位元變化,深化補碼理解。