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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yuan121 中级黑马   /  2015-9-15 21:41  /  773 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一. 多态
1. 多态概念,定义
什么是多态:
多态就是某一类事物的多种形态;

官方一点说:
多态就是,不同的对象以自己的方式响应父类同名的方法,这就是多态;

代码中体现出来:
父类的指针指向了子类的对象;Animal *ani = [Dog new];

多态条件:
1.有继承关系
2.有方法的重写


2.多态代码实现:
//实例化猫的对象
Animal *animal  = [Cat new]; //父类的指针指向子类对象;
[animal eat];

//实例化狗的对象
animal = [Dog new]; //父类的指针指向子类对象。
[animal eat];



3.多态注意点:
1) 如果存在多态,父类是可以访问子类特有的方法
假设子类Dog 有一个特有的方法bark
Animal *an2 = [Dog new];         //编译时看等号左边,运行时看等号右边
[(Dog*)an2 bark]; //把父类的指针,强制类型转换

2) 如果不存在多态,父类是不可以访问子类特有的方法的
Animal *an3 = [Animal new];
[(Dog*)an3 bark]; //错误的,这里只是骗编译器,运行一定报错.



二.类对象
1,类的本质其实也是一个对象(类对象,Class类型);

类对象
*类对象在程序运行时一直存在。
*类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等
*每一个对象都包含一个指向其类对象的isa指针。


2、类对象如何获取
通过实例对象获取
Dog *d1 = [Dog new];
Dog *d2 = [Dog new];
Class c =   [d1 class];
Class c2 = [d2 class];

通过类名获取(类名其实就是类对象)
Class c3 = [ Dog  class ];

因为类对象在整个程序中只存在一份,
所以 c = c2 = c3

/**程序执行过程**/

1,当程序一运行,代码就会加加载到代码区;
2,代码加载完成之后,就会调用+(void)load;方法,创建Class类型类对象;做好程序运行的准备;
3,然后找到main函数执行代码;
4,当遇到new创建对象时,通过当前类的类对象进行创建.


/****/


3.类对象的使用
1)可以用来调用类方法:
//获取类对象
Class c1 = [Person class];
//使用类对象调用类方法
[c1 test]; // test是一个+号方法

2)可以用来实例化实例对象, 并且调用对象方法
//获取类对象
Class c1 = [Person class];
//使用类对象创建实例对象
Person *p = [c1 new];
[p test];  // -test 调用对象方法

4. 类对象存储细节
通过打印地址分析测试:类对象存在常量区;

5.SEL类型 (@selector()选择器)
就是对方法的一种包装,将方法包装成SEL类型;

SEL是一种新的数据类型。和id、class一样。
Person *p = [Person new];
SEL s1 = @selector(test);
[p performSelector:s1];

0 个回复

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