11.多态
1.什么是多态?
不同的对象以自己的方式响应同一个指令的能力.
2.多态的条件的是什么?
1)要存在继承关系
2)存在方法的重写(必须有同名方法)
3)父类的指针必须指向子类的对象
3.多态的实现
Dog 继承自 Animal Animal 是Dog类的父类
Animal *ani = [Animal new]; //正常写法
Animal *ani2 = [Dog new]; //父类指针指向了子类对象,这就是多态.
动态绑定: 动态类型能使程序直到执行时才确定对象所属类型 动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法
//动态类型,一个对象的类型不是编译的时候确定的,而是运行的时候确定
//(也就是说,一个对象,只有在运行的时候才能确定自己的类型,这就是动态类型)
4.多态的注意点:
1)如果存在多态,父类是可以访问子类特有的方法
2)如果不存在多态,父类是不可以访问子类特有的方法的
12、类的本质
类的本质其实也是一个对象(类对象)
类对象
*类对象再程序运行时一直存在。
*类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与方法 的映射表等
*类对象所保存的信息在程序编译时确定,在第一次使用该类的时候被加载到内存中。
*类对象代表类,class代表类对象,类方法属于类对象
*如果消息的接收者是类名,则类名代表类对象
*运行时,所有类的实例对象都由类对象生成,类对象会把实例的isa的值修改成自己的地 址,每个实例的isa都指向该实例的类对象,
*从类对象里可以知道父类信息、可以响应的方法等
*类对象只能使用类方法,不能用实例方法
//创建对象(实例对象)
Car *car = [Car new]; //car 实例对象
//Car也是一个对象,类对象,是Class类型的
//类对象的获取?
//1)通过类名来获取类对象
Class c1 = [Car class]; //c1是一个类对象 == Car
NSLog(@"c1 = %@,%p",c1,c1);
//2)通过实例对象名来获取类对象
Class c2 = [car class];
NSLog(@"c2 = %@,%p",c2,c2); //c2 == Car
13.SEL 类型
SEL 是一种类型
选择器类型: 可以把一个方法包装成此类型 通过SEL类型,可以找到 在代码区的方法的地址
SEL s1 =@selector(eat); //把eat方法,包装成SEL类型了
[p performSelector:s1]; //发送s1 向 p对象发送 s1,对比p方法中与s1相同的地址并调用 |
|