A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 新生heima 中级黑马   /  2015-8-18 23:40  /  427 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多态的概念:
不同的对象以自己的方式相应父类同名的方法

体现出来:
父类的指针指向子类的对象(不只是父类,其实父父类也可以这样)
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方法则不能使用点语法。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马