多態(upcast)減少分支判斷 以及 多態繼承設計、具體類型判斷。
阿新 • • 發佈:2018-03-24
ret ada ati 改變 over post () 子類 cto
Influenced by 《java 八榮八恥》,翻了下《java編程思想》
印象中多態產生的條件:1.子類繼承父類 2.父類【指針】指向子類 3.父類引用調用重寫(@Override)方法
* 大家註意指針的這個字眼,如果方法是靜態的話沒有指針,多態是沒法運作的,本質上多態產生條件就是一個【upcast】。
【回顧重載和重寫】
1.@Override 子類對父類允許訪問的方法 重寫 。(異常:不能拋出比父類更多異常、訪問修飾:不能更封閉)
* 加了註解IDE會幫忙檢查 方法名 + 參數列表 + 返回值是否一致。
* 常見實現接口,接口本身是一種規範,我們要按規範去實現方法,【面向接口編程達到松耦合目的(spring的ioc控制反轉依賴註入做到了)】
正如接口是規範,返回值 + 方法名 + 參數列表 就要和規範一樣了。
2.Overload 一個方法名字表達清晰,重載它!方法名一樣,參數列表不同(甚至到子類去重載也可以)
【正題】
那多態怎麽又和if else產生聯系了呢? 待我實踐後再來編輯~~~
【多態繼承設計】組合 => 繼承(繼承需要在編譯時知道類型)
【組合狀態模式】狀態改變 => 行為改變。
class Actor { public void act() {} } class HappyActor extends Actor { public void act() { System.out.println("HappyActor"); } } class SadActor extends Actor { public void act() { System.out.println("SadActor"); } } class Stage { private Actor actor = new HappyActor(); public void performPlay() { actor.act(); } public void change() { boolean isHappyActor = actor instanceofHappyActor; actor = isHappyActor?new SadActor():new HappyActor(); } } public class Test { public static void main(String[] args) { Stage stage = new Stage(); for (int i = 0; i < 10; i++) { stage.performPlay(); stage.change(); } } }
【By the way】
【判斷對象具體類型】
【instanceof運算符號】
Object obj = new Object();
Object obj = new Foo();
boolean b = obj instanceof Foo;//true
【庫方法】
public static boolean areTypesCompatible(Object expected, Object obj) { return Objects.requireNonNull(expected) .getClass() .isInstance(obj); }多態(upcast)減少分支判斷 以及 多態繼承設計、具體類型判斷。