前言:語法是溝通機器的橋樑
Applet 只是 Java 的一種部署形式,核心語法與 Java SE 完全一致。若有 C/C++ 基礎,Java 語法極其親切:去除了指針、多重繼承、運算符重載,加入垃圾回收、內建字符串、統一物件模型。本章以「最小必要知識集」快速建立語法直覺,配合代碼片段即學即用。
一、變量宣告與命名規範
// 語法:類型 變量名 [= 初始值];
int x = 10;
char grade = 'A';
float pi = 3.14f;
String name = "Applet";
// 合法標識符規則
// 1. 字母、數字、底線 _、美元符號 $ 組成
// 2. 首字符不能是數字
// 3. 區分大小寫 (name ≠ Name)
// 4. 不能是關鍵字 (class, int, for...)
// 推薦風格:駝峰命名
int maxCount; // 變量/方法
final double PI = 3.14159; // 常量全大寫+底線
class UserAccount {} // 類 PascalCase
二、八大基本數據類型 (Primitive Types)
| 分類 | 類型 | 關鍵字 | 位數 | 範圍 / 說明 | 預設值 |
| 布爾 | boolean | boolean | 1 (實際佔 1 字節) | true / false | false |
| 字符 | 字符 | char | 16 (Unicode) | \u0000 ~ \uFFFF (0~65535) | '\u0000' |
| 整數 (有號) | 位元組 | byte | 8 | -128 ~ 127 | 0 |
| 短整數 | short | 16 | -32,768 ~ 32,767 | 0 |
| 整數 | int | 32 | -2.147B ~ 2.147B | 0 |
| 長整數 | long | 64 | -9.22E18 ~ 9.22E18 | 0L |
| 浮點數 (IEEE 754) | 單精度 | float | 32 | ±1.4E-45 ~ ±3.4E+38 (約 7 位有效數字) | 0.0f |
| 雙精度 | double | 64 | ±4.9E-324 ~ ±1.8E+308 (約 15 位有效數字) | 0.0d |
關鍵細節
- 字面值後綴:
long l = 100L;、float f = 3.14f;、double d = 3.14; (無後綴默認 double)。
- 科學計數法:
3.14E3 = 3140、3.14E-2 = 0.0314。
- char 與 int 互轉:
char c = 'A'; // 65、char c = 65; // 'A' — 字符本質是無號 16 位整數。
- boolean 無數值轉換:不能當 0/1 用,嚴格 true/false。
三、類型轉換
自動擴寬轉換 (Widening) — 無損精度/範圍
byte → short → int → long → float → double
char → int → long → float → double
// 編譯器自動完成
int i = 100;
long l = i; // OK
double d = l; // OK
強制窄化轉換 (Narrowing) — 可能溢出/截斷
double → float → long → int → short → byte
// 必須顯式轉型
double d = 3.99;
int i = (int) d; // i = 3 (截斷小數)
long L = 300;
byte b = (byte) L; // b = 44 (溢出截取低 8 位)
四、運算符完全圖譜
| 優先級 (高→低) | 分類 | 運算符 | 說明 |
| 1 | 後綴 | expr++ expr-- | 後增/減 (先用值再改變) |
| 一元 | ++expr --expr +expr -expr ~ ! | 前增/減、正負號、位邏輯非、邏輯非 |
| 2 | 乘除模 | * / % | 左結合 |
| 3 | 加減 | + - | 字串連接時 + 為重載 |
| 4 | 位移 | << >> >>> | 左移、帶號右移、無號右移 |
| 5 | 關係 | < <= > >= instanceof | 回傳 boolean |
| 6 | 等值 | == != | 基本類型比值、引用類型比地址 |
| 7 | 位與 | & | 按位 AND |
| 8 | 位異或 | ^ | 按位 XOR |
| 9 | 位或 | | | 按位 OR |
| 10 | 邏輯與 | && | 短路 (左假右不算) |
| 11 | 邏輯或 | || | 短路 (左真右不算) |
| 12 | 三元 | ? : | cond ? valTrue : valFalse |
| 13 | 賦值 | = += -= *= /= %= &= ^= |= <<= >>= >>>= | 右結合,a += b ≡ a = a + b |
經典陷阱
int x = 2;
int y = (++x) * 3; // x=3, y=9
int z = (x++) * 3; // x=4, z=9 (用舊值 3 乘)
boolean flag = true;
int a = flag ? 10 : 20; // a = 10
// 短路效應
if (obj != null && obj.method()) { ... } // obj 為 null 時不調用 method(),避免 NPE
五、陣列
三步驟:宣告 → 配置空間 → 初始化
// 1. 宣告 (兩種寫法等價)
int[] scores;
int scores[];
// 2. 配置空間 (必須指定長度)
scores = new int[5]; // 索引 0~4,預設值 0
// 3. 初始化 (可合併 1+2+3)
int[] scores = {90, 85, 78, 92, 88}; // 長度自動為 5
// 多維陣列 (不規則陣列)
int[][] matrix = new int[3][];
matrix[0] = new int[2];
matrix[1] = new int[4];
matrix[2] = new int[3];
核心屬性
arr.length — 唯一屬性 (非方法),一維陣列長度;多維取各維 matrix[i].length。
- 越界拋出
ArrayIndexOutOfBoundsException。
- 陣列是物件,存儲在堆上,變量持有引用。
六、流程控制語句
1. 選擇結構
// if-else 鏈
if (score >= 90) grade = 'A';
else if (score >= 80) grade = 'B';
else if (score >= 70) grade = 'C';
else if (score >= 60) grade = 'D';
else grade = 'F';
// switch (支援 byte/short/char/int/String/enum)
switch (grade) {
case 'A': desc = "優秀"; break;
case 'B': desc = "良好"; break;
case 'C': desc = "中等"; break;
case 'D': desc = "及格"; break;
default: desc = "不及格";
}
2. 循環結構
// for (計數循環)
for (int i = 0; i < 10; i++) { ... }
// while (先判斷)
while (condition) { ... }
// do-while (至少執行一次)
do { ... } while (condition);
// 增強 for (Java 5+,遍歷陣列/Collection)
for (int score : scores) { System.out.println(score); }
3. 跳轉語句
break:跳出最近層 switch/for/while/do-while;帶標籤 break label; 跳出指定外層。
continue:結束本次循環迭代,進入下一次判斷;帶標籤同理。
return:結束方法,可選回傳值。
throw:拋出異常。
outer: for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
if (i==1 && j==1) break outer; // 直接跳出雙層
}
}
4. 異常處理
try {
// 可能拋出異常代碼
} catch (IOException e) {
// 處理 IO 異常
} catch (Exception e) {
// 捕獲其他異常 (父類在後)
} finally {
// 無論如何執行 (關流、釋放鎖)
}
七、綜合範例:打印等腰三角形 (雙層循環)
public class Triangle extends Applet {
public void paint(Graphics g) {
int n = 5; // 高度
for (int i = 1; i <= n; i++) { // 控制行
for (int j = 1; j <= n - i; j++) // 前導空格
g.drawString(" ", 100 + j*10, i*20);
for (int k = 1; k <= 2*i - 1; k++) // 星號
g.drawString("*", 100 + (n-i+k)*10, i*20);
}
}
}
// 輸出:
// *
// ***
// *****
// *******
// *********
八、現代補充:Java 5+ 語法糖 (Applet 時代後引入,但必須知道)
- 泛型:
List list = new ArrayList<>(); — 編譯期類型安全。
- 增強 for:
for (String s : list)。
- 自動裝箱/拆箱:
Integer i = 10; int n = i;。
- 可變參數:
void print(String... msgs)。
- 枚舉:
enum Color { RED, GREEN, BLUE }。
- 靜態導入:
import static java.lang.Math.*;。
- 註解:
@Override, @Deprecated, @SuppressWarnings。
九、避坑速查表
| 錯誤代碼 | 正確寫法 | 原因 |
if (a = 5) | if (a == 5) | 單等號是賦值,回傳值為 5 (真) |
float f = 3.14; | float f = 3.14f; | 無後綴字面值默認 double |
String s == "abc" | "abc".equals(s) | == 比引用,equals 比內容 |
int[] a = new int[5]; a[5]=1; | a[4]=1; | 索引 0~length-1 |
for (int i=0; i<=10; i++) | i < 10 | 長度 10 最大索引 9 |
switch (longVal) | 不可用 long | switch 僅支援 byte/short/char/int/String/enum |