多态(upcast)减少分支判断 以及 多态继承设计、具体类型判断。

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);
}
posted @ 2018-03-24 19:23  chenhui7373  阅读(255)  评论(0编辑  收藏  举报