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);
}