一.多态
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,类的本质其实也是一个对象(类对象);
类对象
*类对象在程序运行时一直存在。
*类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等
*每一个对象都包含一个指向其类对象的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
3.类对象的使用
1)可以用来调用类方法 :
//获取类对象
Class c1 = [Person class];
//使用类对象调用类方法
[c1 test]; // test是一个+号方法
2)可以用来实例化实例对象, 并且调用对象方法
//获取类对象
Class c1 = [Person class];
//使用类对象创建实例对象
Person *p = [c1 new];
[p test]; // -test 调用对象方法
4.SEL类型
SEL是一种新的数据类型。和id、class一样。
Person *p = [Person new];
SEL s1 = @selector(test);
[p performSelector:s1];
三.点语法
1. 传统setter, getter方法
-(void)setAge:(int)age{
_age = age;
}
-(int)age{
return _age;
}
2. 点语法
本质上展开之后相当于调用setter, getter方法
p.age = 10; 展开之后等价于 [p setAge:10]; // setter方法
NSString *name = p.age; 等价于NSString *name = [p name]; // getter方法
对象. 成员变量 //展开之后到底是setter方法, 还是getter方法, 看在等号的左边还是右边,
如果是等号左边就是setter方法, 在等号右边是getter方法
3. 点语法陷阱 :
在set方法使用self.
- (void)setAge:(int)newAge {
self.age = newAge;
}
4、点语法注意
点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。
切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。 |
|