黑马程序员_多态详解

---------------------- 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值