A a = new B();
這個 a 到底是 A 的對象還是 B 的對象?為什麼不直接寫 B a = new B()?
人 張三 = new 男人(); 翻譯為:張三是男人,屬於人類。
| 符號 | 含義 | 類比 |
|---|---|---|
| A | 父類/接口類型 | 人(抽象分類) |
| B | 子類/實現類類型 | 男人(具體分類) |
| a | 引用變量 | 張三(具體個體標識) |
// 靈活性示例
void addPerson(Person p) { ... } // 參數類型為父類
addPerson(new Man()); // 可傳男人
addPerson(new Woman()); // 可傳女人
// 若聲明為 Man man = new Man();
void addMan(Man m) { ... } // 只能傳男人,擴展性差
p.eat(),不同子類表現不同行為。只在需要調用子類特有方法、且確定不再擴展其他子類的局部代碼中。
「抽象的東西往往具有不定性,具有靈活性。具體的東西就定死了。」