1. 程式人生 > >多態(upcast)減少分支判斷 以及 多態繼承設計、具體類型判斷。

多態(upcast)減少分支判斷 以及 多態繼承設計、具體類型判斷。

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 instanceof
HappyActor; 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)減少分支判斷 以及 多態繼承設計、具體類型判斷。