Java 是強類型語言,分為基本類型和引用類型。8 種基本類型是 JVM 直接支援的值類型,不繼承自 Object,佔用固定記憶體大小,跨平台一致性由 JVM 規範保證(這解決了 C/C++ 中 int 長度隨平台變化的移植難題)。
| 分類 | 類型 | 位數 | 預設值 | 取值範圍/說明 |
|---|---|---|---|---|
| 整數 | byte | 8 | 0 | -128 ~ 127 |
| short | 16 | 0 | -32,768 ~ 32,767 | |
| int | 32 | 0 | -2^31 ~ 2^31-1 (約 ±21 億) | |
| long | 64 | 0L | -2^63 ~ 2^63-1,字面量需加 L/l 後綴 | |
| 浮點 | float | 32 | 0.0f | 單精度,約 7 位有效數字,字面量需加 F/f |
| double | 64 | 0.0 | 雙精度,約 15 位有效數字,預設浮點類型 | |
| 字符 | char | 16 | '\u0000' | UTF-16 代碼單元,無符號 0 ~ 65535 |
| 布爾 | boolean | ~1 (JVM 實現相關) | false | true/false,不可與 0/1 互轉 |
int octal = 010; // 八進制 = 8
int hex = 0xCAFE; // 十六進制 = 51966
int binary = 0b1001; // 二進制 = 9 (JDK 7+)
long million = 1_000_000; // 下劃線分隔,編譯器移除,提升可讀性
double price = 1_234.56;
從低精度向高精度,無數據損失風險,編譯器自動完成:
byte -> short -> int -> long -> float -> double
char -^
運算提升規則:byte/short/char 參與運算先提升為 int,整個表達式最終類型取決於最高精度操作數。
高精度向低精度,**可能截斷數據或丟失精度**,必須加括號聲明:
int x = (int) 34.56 + (int) 11.2; // 34 + 11 = 45 (截斷小數)
double y = (double) x + 10 + 1; // 45.0 + 10.0 + 1.0 = 56.0
System.out.println(22.45 * 10); // 224.50000000000002 (二進制無法精確表示 0.45)
財務計算必須使用 java.math.BigDecimal:
import java.math.BigDecimal;
import java.math.RoundingMode;
BigDecimal a = new BigDecimal("22.45"); // 必須用字串構造器,避免 double 傳入帶入誤差
BigDecimal b = new BigDecimal("10");
System.out.println(a.multiply(b)); // 224.50
// 除法需指定精度與捨入模式
BigDecimal c = a.divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP); // 7.48
每種基本類型對應一個包裝類 (Integer, Double 等),JDK 5+ 支援自動拆裝箱:
Integer i = 100; // 自動裝箱: Integer.valueOf(100)
int n = i; // 自動拆箱: i.intValue()
Integer a = 127, b = 127;
System.out.println(a == b); // true (-128~127 緩存池)
Integer c = 200, d = 200;
System.out.println(c == d); // false (超出緩存範圍,新建對象)
System.out.println(c.equals(d)); // true (比較值)
final 修飾,命名全大寫下劃線分隔 (MAX_SIZE),編譯期常量會內聯到調用處。Java 類型系統設計精妙平衡了性能(基本類型)與面向對象(包裝類/泛型)。開發中牢記:金額用 BigDecimal、比較包裝類用 equals、避免無意識的自動拆裝箱產生臨時對象、理解運算提升規則防止溢出 (如 int sum = 0; for(int i=0;i<100000;i++) sum+=i; 會溢出,需用 long)。