1、多态的概述
多态的形式:
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
多态的概念:
同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征。
多态的识别技巧:
对于方法的调用:编译看左边,运行看右边。(调用方法的时候,父类或接口中必须有这个方法,运行的时候,是使用构造器中那类的方法)
对于变量的调用:编译看左边,运行看左边。(变量都是父类或接口中的)
多态的使用前提:
(1) 必须存在继承或者实现关系。
(2) 必须存在父类类型的变量引用子类类型的对象。
(3) 需要存在方法重写。
2、多态的优劣势
优势:
1.在多态形式下,右边对象可以实现组件化切换,业务功能也随之改变,便于扩展和维护。可以实现类与类之间的解耦。
2.实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,可以传入一切子类对象进行方法的调用,更能体现出多态的扩展性与便利。
劣势:
多态形式下,不能直接调用子类特有的功能。父类中没有子类独有的功能,所以代码在编译阶段就直接报错了!
3、引用类型强制类型转换
强制类型转换很好的解决了多态的劣势,因为通过强制类型转换后,父类可以强制转化成子类,子类就可以调用自身独有的方法了。
引用类型强制类型转换的语法:
1.父类类型的变量或者对象必须强制类型转换成子类类型的变量,否则报错!
强制类型转换的格式:
类型 变量名称 = (类型)(对象或者变量)
Java建议在进行强制类型转换之前先判断变量的真实类型,再强制类型转换!
变量 instanceof 类型: 判断前面的变量是否是后面的类型或者其子类类型才会返回true
否则,会出现下面错误
public class PolymorphicDemo {
public static void main(String[] args) {
Animal a1 = new Cat();
Wolf w1 = (Wolf) a1; // 这句话是错误的!!!!编译阶段没有报错!在运行阶段出现
//ClassCastException类型转换成!
// 应该用下面的方法来进行强制转化
if(a1 instanceof Cat){
Cat c1 = (Cat) a1;
c1.catchMouse();
}else if(a1 instanceof Wolf){
Wolf w1 = (Wolf) a1;
w1.catchSheep();
}
}
}