Java 是強類型、靜態類型語言,所有變量使用前必須聲明類型。聲明語法:
type name; // 聲明
type name = value; // 聲明並初始化
其中 type 為數據類型,name 為變量標識符。Java 類型系統分為基本類型與引用類型兩大類。
| 類型關鍵字 | 位數 | 字節數 | 取值範圍 | 默認值 | 包裝類 |
|---|---|---|---|---|---|
boolean |
1 位 (JVM 實際佔 1 字節/4 字節) | — | true / false |
false |
Boolean |
byte |
8 | 1 | -128 ~ 127 | 0 | Byte |
short |
16 | 2 | -32,768 ~ 32,767 | 0 | Short |
int |
32 | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 | Integer |
long |
64 | 8 | -9.22×10¹⁸ ~ 9.22×10¹⁸ | 0L | Long |
float |
32 | 4 | IEEE 754 單精度,約 ±3.4×10³⁸ | 0.0f | Float |
double |
64 | 8 | IEEE 754 雙精度,約 ±1.8×10³⁰⁸ | 0.0d | Double |
char |
16 | 2 | Unicode 字符:\u0000 ~ \uFFFF (0 ~ 65,535) | '\u0000' | Character |
int 類型,超出範圍報編譯錯誤long 字面量必須加 L/l 後綴:long l = 100L;0b1010, 012, 0xFFint million = 1_000_000;// 錯誤示範:財務計算絕不可用 float/double
double price = 0.1 + 0.2; // 0.30000000000000004
// 正確:使用 BigDecimal
BigDecimal price = BigDecimal.valueOf(0.1).add(BigDecimal.valueOf(0.2));
// 或整數分存儲:long cents = 10 + 20;
float 字面量必須加 F/f 後綴:float f = 3.14f;1.23e4 (1.23×10⁴)NaN, Infinity, -Infinitychar[] 或 int (code point) 表示'A', '\n', '\u4E2D', '\101'true/false 兩值,不可與數值互轉(異於 C/C++)int (0/1) 表示boolean[] 1 byte/元素,BitSet 1 bit/元素)棧幀結構 (以 64 位 JVM 為例): ┌──────────────────┐ │ Local Variables │ ← 基本類型直接存值 │ [int a][long b] │ ← long/double 佔 2 個槽位 │ [ref obj] │ ← 引用類型存地址 ├──────────────────┤ │ Operand Stack │ └──────────────────┘
Integer 實際佔用 ~24 bytes vs int 4 bytes// 自動提升 (隱式擴寬轉換) byte → short → int → long → float → double char → int // 強制轉換 (窄化轉換,可能丟失精度/溢出) double → float → long → int → short → byte
最佳實踐:避免不必要的裝箱拆箱;集合泛型必須用包裝類;數值計算熱點路徑優先基本類型;財務/精度敏感領域用 BigDecimal。
// 局部變量類型推導
var count = 10; // 推導為 int
var price = 3.14; // 推導為 double
var name = "Java"; // 推導為 String
var list = List.of(1,2,3); // 推導為 List
// 限制:不能用於字段、方法參數、返回值
// 好處:減少冗餘,配合複雜泛型類型更清晰