为什么使用多态?
大部分多态建立在继承的基础上,多态是:【解决父类方法不适合子类的问题】,继承之后选择性的复用,父子中的方法名相同但是方法体可能不同,多态体现在灵活性,使得代码质量具有复用性、可维护性。
什么是多态?
多态:多种形态,对象的多种形态,行为的多种形态(老人用手机打电话,小孩儿用手机打游戏)
- 》对象的多种形态体现为,子类对象可以通过父类型引用,
Animal obj3 = new Dog(); (比如狗除了是狗还是动物)
2.》行为的多态体现为方法的重写,隐藏,重载
继承将相关概念的共性进行抽象,并提供了一种复用的方式。
多态在共性的基础上,体现类型及行为的个性化,一个行为有多个不同的实现
多态的实现方式,有几种实现多态的方式?
实现多态的基本方式:隐藏,重写;
实现多态其它方式:重载,接口,
1》、方法隐藏
如果父类的方法不能重写(不是virtual,abstract,override),此时可能选择方法隐藏。
定义:
调用:
方法隐藏 :指的是技术,子类新定义一个方法,与父类方法同签名,子类型用新定义的方法隐藏掉父类继承的旧方法。
隐藏方法:隐藏方法建议在方法前加new关键字,new可以省略但最好不要省 。
下面是利用方法隐藏计算圆、三角形、矩形的面积:
调用:
上面方法隐藏的缺点是只能子调子方法,不能父调子方法,但是如果想要
希望通过父调子,好处:调用端代码可以更加简洁, 声明一个变量即可!但是重写可以实现父调子。
2》、方法重写
下面是利用方法重写计算圆、三角形、矩形的面积:
调用:
方法隐藏原理
方法隐藏是子类的方法表加入一个新项,新项中表示的方法签名与继承来的方法签名一致,但是在方法表中不能出现相同签名的方法项,所以必须要隐藏掉一个,子类用新项(开辟新的内存地址)隐藏旧项。
方法重写原理
父类的方法在子类重写后,是子类型将方法表中相应方法签名对应的方法所在的地址重写了,重写后,原方法签名项关联到新方法的地址。当引用调用该方法时,访问新地址中的方法。
所以方法重写后,不管是通过父类还是子类型的引用,调用方法时,都调用对象真实类型中定义的方法。
总结:隐藏和重写的比较
共性:都是多态实现的基本方式,都可以实现选择性的复用【解决父类方法不适合子类的问题】
不同:
1)隐藏不能实现父调子方法 父 obj=new 子()
重写可以实现父调子 从而让代码具有更好的复用性,
可维护性。
实际开发中重写用的多
2)实现原理不同【了解】
隐藏 静态绑定 性能略高 灵活性差
重写 动态绑定 性能略低 灵活性好
如果实现同样的功能,不需要父调子,仅仅为了选择性复用,使用隐藏 性能略高!
绑定:通俗讲就是系统确定一个类型能够调用哪些方法
1静态绑定(编译时绑定):是指调用关系是在运行之前确定的,即编译期间
2 动态绑定(运行时绑定):是指调用关系是在运行期间【过程中】确定的。
静态绑定因为在编译期确定,不占用运行时间,所以调用速度比动态绑定要快。
动态绑定因为在运行期确定,占用运行时间,但是更灵活。动态绑定比静态绑定灵活性好. 速度略低。