首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 數據類型與變量深度解析:從基本類型到類型轉換陷阱

     編輯:Java 相關知識

Java 類型系統概覽

Java 是強類型語言,分為基本類型和引用類型。8 種基本類型是 JVM 直接支援的值類型,不繼承自 Object,佔用固定記憶體大小,跨平台一致性由 JVM 規範保證(這解決了 C/C++ 中 int 長度隨平台變化的移植難題)。

分類類型位數預設值取值範圍/說明
整數byte80-128 ~ 127
short160-32,768 ~ 32,767
int320-2^31 ~ 2^31-1 (約 ±21 億)
long640L-2^63 ~ 2^63-1,字面量需加 L/l 後綴
浮點float320.0f單精度,約 7 位有效數字,字面量需加 F/f
double640.0雙精度,約 15 位有效數字,預設浮點類型
字符char16'\u0000'UTF-16 代碼單元,無符號 0 ~ 65535
布爾boolean~1 (JVM 實現相關)falsetrue/false,不可與 0/1 互轉

進制字面量與下劃線分隔符 (JDK 7+)

int octal = 010;       // 八進制 = 8
int hex = 0xCAFE;      // 十六進制 = 51966
int binary = 0b1001;   // 二進制 = 9 (JDK 7+)
long million = 1_000_000; // 下劃線分隔,編譯器移除,提升可讀性
double price = 1_234.56;

類型轉換:隱式 vs 顯式

隱式轉換 (自動類型提升)

從低精度向高精度,無數據損失風險,編譯器自動完成:

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

浮點數精度陷阱與 BigDecimal

⚠️ 永遠不要用 float/double 處理金額計算!
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 (比較值)

變量作用域與生命周期

  • 局部變量:方法/代碼塊內,棧上分配,**無預設值,必須顯式初始化**才能使用。
  • 成員變量 (欄位):堆上隨對象分配,有預設值 (0, null, false)。
  • 常量:final 修飾,命名全大寫下劃線分隔 (MAX_SIZE),編譯期常量會內聯到調用處。

總結

Java 類型系統設計精妙平衡了性能(基本類型)與面向對象(包裝類/泛型)。開發中牢記:金額用 BigDecimal、比較包裝類用 equals、避免無意識的自動拆裝箱產生臨時對象、理解運算提升規則防止溢出 (如 int sum = 0; for(int i=0;i<100000;i++) sum+=i; 會溢出,需用 long)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved