作者因項目需求速成 Java,後因基礎不牢吃盡苦頭。經過年半實踐,總結出 Java 學習的六個階段,並分享「理論 → 演繹 → 歸納」三步學習法,助君少走彎路。
前三階段針對 Java 本身;第 4、5 階段在前三階段基礎上吸收前人智慧;第 6 階段進入軟件設計自在境界。作者目前處於第 4 階段,第 5、6 階段為推演預判。
數據類型、操作符、控制流程、類與繼承、包與接口、異常處理
心得:優秀程序員不僅能寫好代碼,更能清晰闡述程序功能與結構。語法熟練是說清結構的前提。作者曾因依賴 IDE 提示導致語法生疏,重學後獲益良多。
class/object、interface/abstract class、封裝 (public/protected/private)、繼承、多態、UML 基礎 (類圖/狀態圖/時序圖)
研讀 23 種 GoF 設計模式的 UML 圖與示例代碼。推薦《Java 與模式》、JDon 設計模式專區。此階段不求精通模式,只求讀懂 UML 與代碼結構。
體會 OCP 原則 (對擴展開放,對修改關閉),學會用 OO 概念設計 Java 代碼。作者早期用面向過程思維寫 Java,讀 GoF 雖晦澀但建立了 OO 概念,《Java 與模式》更易入門。
必須掌握
java.lang和java.util兩大包。許多資深開發者離開 IDE 連常用類層次都說不清,這樣寫不出優秀代碼。
java.lang:String/StringBuffer、包裝類、Process/Runtime/System、Object/Cloneable/Class/ClassLoader、Thread/ThreadGroup/Runnable、Package
java.util:Collection 體系、Map 體系、Arrays/Enumeration/Vector/Stack/Dictionary/Hashtable/Properties、StringTokenizer、BitSet、Date/Calendar/Locale、Random、Observer/Observable
// 被觀察者
class BeingWatched extends Observable {
void counter(int period) {
for (; period >= 0; period--) {
setChanged();
notifyObservers(new Integer(period));
Thread.sleep(100);
}
}
}
// 觀察者
class Watcher implements Observer {
public void update(Observable obj, Object arg) {
System.out.println("Update() called, count is " + ((Integer)arg).intValue());
}
}
// 測試
public class ObserverDemo {
public static void main(String[] args) {
BeingWatched observed = new BeingWatched();
Watcher observing = new Watcher();
observed.addObserver(observing);
observed.counter(10);
}
}
輸出 10~0 遞減計數,展示 JDK 內建 Observer 模式。
對比三個 printAll 版本:
// 差:針對具體類重載
void printAll(Vector v) { ... }
void printAll(HashSet hs) { ... }
// 好:針對接口編程
void printAll(Collection c) { // 一個方法兼容所有 Collection 實現
Iterator it = c.iterator();
while (it.hasNext()) System.out.println(it.next());
}
再如 CollectionClassifier 重載陷阱:因不熟悉層次結構 (HashSet 是 Set、ArrayList 是 List、HashMap.values() 是 Collection) 導致重載解析失敗,全部落入 classify(Collection)。
JDK 通過 java.lang.reflect.Proxy + InvocationHandler 實現 Proxy 模式:
public class VectorProxy implements InvocationHandler {
private Object target;
public VectorProxy(Object obj) { target = obj; }
public static Object factory(Object obj) {
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new VectorProxy(obj));
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before " + method);
Object result = method.invoke(target, args);
System.out.println("after " + method);
return result;
}
public static void main(String[] args) {
List v = (List) factory(new Vector(10));
v.add("New"); v.add("York");
}
}
基本類庫不僅提供工具類,更包含為繼承/擴展設計的類 (如 InvocationHandler),主動學習其 API 才能掌握高階用法。類庫將 OCP 原則發揮到極致。
| 書名 | 特點 | 適合度 |
|---|---|---|
| 《設計模式》 (GoF) | 開創性經典、23 模式、Smalltalk/C++ 示例、自創標記法 (非 UML)、晦澀難懂 | 進階研讀、收藏 |
| 《Java 與模式》 | 針對 Java、UML 标记、大量簡單示例、44 章覆蓋 26 模式 + 18 主題、淺顯易懂且有深度 | Java 開發者首選入門 |
設計模式學習需反覆實踐,非一蹴而就。
Java 學習無捷徑,唯有「理論 → 演繹 → 歸納」循環往復,配合經典著作與實戰項目,方能登堂入室。