------- android培训、java培训、期待与您交流! ----------
1,多态的概念:
同一种行为,对于不同的事物具有不同的表现形式。 这就叫做多态。
程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态
多态的条件:
有继承关系、有方法重写
父类的声明变量指向子类对象。
代码体现:用父类类型的指针指向了子类对象,这就是多态
狗 *g = [狗 new];
动物 *a = [狗 new];
[a catch];//实现狗拿耗子的方法
猫 *c = [猫 new];动物 *a = [猫 new];
[a catch];//实现猫捉老鼠的方法
2,多态的优点:
多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。
多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象。这样使得您的代码扩展性和复用性更好一些。当一个新的情景出现时,您无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。
3,多态的原理:
动态绑定:
动态类型能使程序直到执行时才能确定对象所属类型
动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法
oc不同于传统程序设计语言,它可以在运行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载
id类型:通用指针类型,弱类型,编译时不进行类型检查
4,多态注意:
1)如果存在多态,父类是可以访问子类特有的方法
[dog bark];
Animal *an2 = [Dog new];
[(Dog*)an2 bark]; //把父类的指针,强制类型转换
虽然是Animal的指针,但是在堆区的空间里是dog的对象,所以可以强制转换为dog,调用狗的bark方法。
2)如果不存在多态,父类是不可以访问子类特有的方法的
Animal *an3 = [Animal new];
[(Dog*)an3 bark];
因为在栈区的an3指针指向堆区的Animal对象,即便将其转换强制转换为dog,本身并没有变,还是animal对象。不存在dog的方法。