---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、多态的产生:
多态出现之前,发现子类继承父类,当每多一种子类的时候,就需要为这个子类单独定义一个功能,让子类对象去实现功能。
这样的话程序的扩展型就很差。因此我们要提高程序的扩展性,既然父类包含子类里面共性的功能,就将共性的功能进行抽取,抽取到父类中。
任何一个子类都是其父类的一种:
例如:
狗(Dog)是动物(Animal)的一种,代码就可以写为 Animal a = new Dog();
只要建立了Animal的引用就可以接受所有子类对象。
提高程序的扩展性。
二、多态的概念体现:
多态就是父类引用指向子类对象。 简单理解就是一种事物可以有多种形态。
例如:
Dog d = new Dog(); //Dog对象的类型是Dog类型
Animal a = new Dog(); //Dog对象的类型右边是Dog类型,左边是Animal类型。
好处:
多态提高了程序的扩展性。
弊端:
通过父类引用操作子类对象时,只能使用父类中已有的方法,不能直接操作子类中特有的方法。
多态的前提:
a、必须由关系:继承或者是实现
b、一般都伴随着子类重写父类的操作
三、向上转型和向下转型:
1、向上转型:
Animal a = new Dog(); //向上转型是将子类类型转换为父类类型。将Dog类型自动转换为Animal类型
好处:
提高了程序的扩展性,隐藏了子类型。
弊端:
无法使用子类特有方法。
2、向下转型:
向上转型无法使用子类特有方法,要想使用子类特有方法,只有子类型才可以使用其方法。
因此可以进行向下转型,进行强制转换。
Animal a = new Dog();
Dog d =(Dog) a; //将 Animal 类型的对象 a 强制转换为 Dog 类型。
这时候对象 d 就可以直接使用子类特有的方法。
注意事项:
向下转型因为不明确子类对象类型,所以容易引发 ClassCastException 异常,因此我们为了避免这个问题,需要在转型之前,做类型的判断。
用关键字 instanceof
<span style="font-size:18px;"> Animal a = new Dog();
if(a instanceof Cat) { //a指向的对象的类型是Cat类型。
Cat c = (Cat)a; //将a转型Cat类型。
c.catchMouse();
} else if (a instanceof Dog) {
Dog d = (Dog)a; //将a转型Dog类型。
d.lookHome();
}</span>
3、注意事项:
无论向上转型还是向下转型,最终都是子类对象在做着类型的变化。
4、总结:
a、什么时候使用向上转型:
当为了提高程序的扩展性,不关系子类型,且不需要调用子类型特有方法时,可以进行向上转型。
b、什么时候使用向下转型:
当需要使用子类特有方法,就需要进行向下转型。使用时一定要进行类型判断,防止出现 ClassCastException 异常
四、多态中成员调用的特点:
1、成员变量的调用:
当子类与父类出现同名的成员变量时,编译和运行都参考等号的左边。
2、成员函数:
编译时期参考等号左边,如果左边类型所属的类,没有该方法,则会编译失败。
运行时期参考右边对象所属的类。
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com