多态,同一个对象的行为,不同条件,表现不同的效果
实现多态的三个条件
- 继承
- 方法覆盖
- 父类引用指向子类实例(对象)
成员变量
编译看左边,运行看左边,也就是引用类型
编译看左边,因为需要通过引用变量的值也就是地址去堆中的去操作
人看电视用遥控器,我们使用电视机的功能被遥控器所限制
每一个new都是披上了父类的马甲,所以具有父类的外貌特征,所以是拥有属性
成员方法
编译看左边,运行看右边,也就是引用变量实际指向的对象类型
运行结果,由于多态指向了实际的对象方法
多态的弊端
无法通过父类引用使用子类独有的方法,可以使用引用类型转化,条件必须是具有父子类型的引用变量
将子类引用转换成父类引用,向上转型,默认允许
Duck duck = new Duck();
Animal animal = duck;
将父类引用转换为子类引用,向下转型
Animal animal = new Animal();
Duck d = (Duck) animal;
这样不行,是虚假的,我们需要实际上就将animal指向duck
Animal animal = new Animal();
animal = new Duck();
Duck dd = (Duck) animal;
collectAnimalStudy(dd);
instanceof
帮我们判断一个对象的实际类型是否是目标类型
animal instanceof Duck
instanceof 看的是实际的有没有,所以下面这个代码会false
Animal animal = null
animal instanceof Duck