expr++ expr--、() [] .++expr --expr +expr -expr ~ !、(type) new* / %+ -<< >> >>>< <= > >= instanceof== !=&^|&&(短路)||(短路)? := += -= *= /= %= &= ^= |= <<= >>= >>>=(右結合)括號最高,可任意改變默認順序。同優先級按結合方向(多為左→右,賦值右→左)。
無 **,用 Math.pow(double a, double b) 返回 double。整數乘方可自寫快速冪或用 BigInteger.pow()。
int a = 5;
int b = a++; // b=5, a=6(先用後增)
int c = ++a; // a=7, c=7(先增後用)
表達式語句獨立行時 a++ 和 ++a 效果相同,但在複合表達式中語義截然不同。
& 按位與(掩碼取位)| 按位或(置位)^ 按位異或(翻轉、交換變量 a^=b^=a^=b)~ 按位取反<< 左移(乘 2n,補 0)>> 右移(除 2n,符號位擴展)>>> 無符號右移(高位補 0,**無 <<<**)位運算僅適用於整數類型(int、long、short、char、byte),操作前自動提升為 int。
檢查對象是否為類/接口/子類實例。Java 16+ 模式匹配:if (obj instanceof String s) { s.length(); } 直接賦值變量。
按從寬到窄順序,雙操作數統一提升至較寬類型:
double > float > long > int > short/char/byte
// 具體:
// 任一為 double → 另一提升為 double
// 否則任一為 float → 另一提升為 float
// 否則任一為 long → 另一提升為 long
// 否則任一為 int → 另一提升為 int
// 否則 short/char/byte 參與運算先提升為 int
結果類型 = 提升後類型。如 byte + byte → int,需強轉回 byte。
double d = 9.99;
int i = (int) d; // 截斷小數部分 → 9
long l = (long) d; // 9
// 四捨五入
int rounded = (int) Math.round(d); // 10
窄化轉換可能丟失精度、溢出、符號改變,編譯器強制要求造型確認風險。
無需造型的安全賦值鏈:
byte → short → int → long → float → double
char → int
// 例:
byte b = 10;
int i = b; // 合法
byte b2 = i; // 錯誤,需 (byte) i
final 常量賦值給較窄類型若在範圍內編譯器允許(常量折疊):byte b = 100; // ok。
a += b 隱含造型:byte a=1; a+=2; // 合法,等價 a=(byte)(a+2)。==,用 Math.abs(a-b) < EPSILON。BigInteger、BigDecimal(金融必須)。1 << 32 == 1。