多态的概念:
不同的对象以自己的方式相应父类同名的方法
体现出来:
父类的指针指向子类的对象(不只是父类,其实父父类也可以这样)
Animal *p=[Dog new];
Animal *p=[Cat new];
多态的条件:
1) 有继承关系
2) 有方法的重写(子类把父类的方法重写了)
多态的原理:
动态绑定:只到执行的时候才知道变量是什么类型
多态的使用注意:
1) 父类调用子类新增的方法
Animal *a5=[Dog new];//此时a5是Animal类型的,还不能调用Dog类的新增方法
[(Dog *) a5 eat];//此时把a5强制类型转换成Dog类之后就可以了
错误用法:
Animal *a6=[Animal new];//此时a6是Animal类型的,生成的对象也是Animal类型的,该类型中没有eat方法,即使强转也不能使用
[(Dog *) a6 eat];
类的本质:
Person *p =[Person new];
其中p是一个实例对象,是Person类型的
Person是一个类对象,是Class类型的
类对象的获取方法:
类对象属于Class类型(Class是一个结构体指针,所以Class类型的变量就不需要加*了)
1,可以通过实例对象来获取
Class c1=【d class】
2,通过类名获取类对象
Class c2=[Dog class]
用类名可以做哪些事情?
创建对象
【Dog new】
调用类方法
[Dog test]
Class c2=[Dog class];//这里c2等同于Dog
C2* d2=[c2 new];
SEL类型
全称selector,表示方法的存储位置
SEL其实是对方法的包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时的特性,发送消息,其实就是发送SEL,根据SEL找到地址,调用方法。
SEL s1 = @selector(test);//手动把test包装成selector类型
[p performSelector:s1];//p发送了一条SEL消息
以上两句等于[p test];
点语法:Xcode的特性,Xcode 帮我们做的代码替换。
对象。属性名
注意,此时(p.age)并不是 直接访问实例变量,而是Xcode看到点语法(p.age),会帮我们自动替换p.age=18;替换[p setAge:18];
Int a = p.age;//注意,此时p.age出现在等号的右侧 ,在这种条件下,Xcode看到后会帮我们把p.age替换成[p age];
点语法注意:
点语法的本质是方法调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。切记点语法的本质是转换成set和get方法,如果没有set和get方法则不能使用点语法。
|
|