面向对象的三大特性
一、封装
概念:封装就是不提供内部具体实现细节,仅提供公共接口供外部使用
优点:(1)既允许外部使用成员变量,又使得外部不能随意修改成员变量。 (2) 保证数据安全
二、继承
概念:A类继承B类,则A为子类B为父类, A即可使用B的所有属性和方法。
优点:提高代码复用性。子类继承可以直接调用父类方法。
注意:
- 调用顺序: 子类父类方法同名,优先调用子类方法;
- 子类可以重写父类方法,但是不能重写属性,否则报重复定义;
三、多态
概念:父类指针指向子类对象,即子类创建的对象将由父类接收。
- 例子:
Animal *a = [[Cat alloc]init];
[a eat]
条件:
- (1) 必须存在继承关系 , 如 猫继承动物;
- (2) 子类必须重写父类方法;
- (3) 父类指针指向子类对象; 如应由Cat类接收的改为Animal类;
原理:动态绑定
- 编译时,不会确定对象的类型,只会判断对象中是否具有方法。
- 在运行时,会确定真正的对象类型,调用该对象的方法。 如
[a eat];
最终会转为[cat eat];
优点:
提高代码的扩展性;父类可以调用子类的方法,之前的方法可以调用方法的代码;
注意点:
(1) 多态必须满足三个条件才能使用;
(2) 子类进行方法重写,父类才能调用子类方法;
(3) 如果父类调用子类特有的方法sleep,必须进行强制类型转换。 Cat *c = (Cat*)a;
[c sleep];
补充: 1. 为什么说Objective-C是一门动态编程语言 ?
答: 因为多态使OC 具有动态性,主要体现在三个方面。
(1) 动态类型: 即 id 类型,表示对象具体什么类型需要到运行时才能确定。
(2) 动态绑定: 对象绑定的方法,具体调用什么方法需要在运行时才能确定。
(3) 动态载入:不是在编译阶段把所有代码和资源加载进去,而是在运行时根据需要有选择的加载资源。
2. 静态数据类型与动态数据类型?
- 静态数据类型 如 Person *p, 在编译阶段就能确定对象具体类型,具备哪些属性和方法;
- 动态数据类型 即 id *p , 编译时并不知道对象具体类型,只有在运行时才能知道对象的类型和属性等;
- id 类型的特点
** (1) 静态数据类型,不能直接调用子类特有的方法,若调必须进行强转;
id类型 可以直接调用子类特有的方法;
(2) id类型可以直接调用私有的方法。
测试存疑: id类型修饰对象,父类可以调用父类的私有方法,子类因为继承也可以调用父类的私有方法。
如果说父类不能调用子类的私有方法可以理解, 但是子类为什么不可以调用自己的私有方法?
- id类型的应用场景和弊端
应用: 很少,只有用到多态的时候,为了简化代码避免强制类型转换才会使用。
弊端: 调用了不属于id所修饰对象的方法,编译不会报错但是运行会出错,运行时的错误较难排查。
改进: 为了避免上述弊端,可以加一层判断,判断是否为该类型。如 Person和son类,son中具备sleep方法。
id p = [[Person alloc]init];
// [p sleep];
if ([p isKindOfClass:[Son class]]){ // 如果不是Son类,就不会调用sleep方法,避免运行时崩溃
[p sleep];
}
四、self 与super
注:self 和 super 都是与类相关,方便方法的调用。
1. self
self 调用如果在类方法中, self == 调用该类方法的那个类;
self 调用如果在对象方法中, self == 调用该对象方法的那个对象;
场景:
- 方便对象方法间相互调用;
- 方便类方法间 的相互调用;
2. super
super 调用如果在类方法中, super == 调用该类方法的那个类的父类;
super 调用如果在对象方法中, super == 调用该对象方法的那个对象的父类对象;
场景:
- 最常用: 子类使用super继承父类的方法,再自定义进行扩展。
-(void)viewDidLoad{
[super viewDidLoad];
...
}
3.self 与 super 区别
self 先去本类中查找方法,再去父类中找;
super 直接去父类中查找是否有该方法;
辨析:
@implementation Son : Father
- (id)init
{
self = [super init];
if (self) {
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
提示:需要结合RunTime
iOS Runtime面试题([self class] 与 [super class])