面向对象的三大特性:封装,继承,多态。
1、继承
继承既能保证类的完整,又能简化代码。
把公共的?法和实例变量写在?类?,?类只需要写??独有的实例变量和?法即可。
继承是?向对象三?特性之?,合理的继承,能减少很多冗余代码,加快开发速度。
1> 继承的特点:
继承的上层:父类,继承的下层:子类。
继承的内容:所有实例变量和方法。
继承是单向的,不能相互继承。
继承具有传递性:A继承与B,B继承与C,A具有B和C的特征和行为。
如果子类不满意父类方法的实现,可以重写(overwrite)父类的方法。
2> super
super是编译器指令,并?对象。
作?:给super发消息,可以执??类该?法的实现 。
重写从?类继承过来的?法的三种情况:
• 完全以?类的实现内容为主,丢弃?类实现的内容。
• 完全以?类的实现内容为主,没有?类实现的内容。
• 既有?类对该?法的实现,也有?类对该?法的实现。
3> 消息发送机制
2、初始化方法
1> 初始化方法
初始化?法的主要作?是:为某些实例变量赋初值。
初始化?法在对象的整个?命周期?只使??次。
注:初始化?法是在对象的初始化阶段完成其实例变量的赋值操作,?个对象的初始化阶段只有?次,所以初始化?法只使??次。
1 - (id)init { 2 //给super发送init消息:执??类中实现的init?法 3 self = [super init]; 4 //判断从?类继承过来的init?法是否初始化成功 5 if (self) { 6 //初始化设置 7 } 8 //返回初始化完成的对象 9 return self; 10 }
?类定义了除?类中公共实例变量之外的实例变量。
在??的初始化?法中,优先向super发送init消息,初始化公共变量, 初始化成功之后,再初始化??特有变量,从?完成全部实例变量的初始化。
2> self
self是系统关键字。 self在?法中指代当前?法的调?者。
self在实例?法中,指代调?当前?法的对象。
- (void)objectMethod { }
self在类?法中,指代当前类。
+ (void)classMethod { }
3> 初始化方法特征
• 初始化?法是 "_"?法。
• id 或者 instancetype 类型的返回值。
• 以init开头。
• 可以带 0 到多个参数。
内部实现:先执?super的初始化?法,再初始化??变量,后return self
4> 初始化过程
- ??的初始化?法中,优先调??类的初始化?法。
- ?类的初始化?法中再调??类的初始化?法,依次往上调?。
- 处于最上层的初始化完成之后,回到第?层的初始化?法中, 完成第?层的初始化。
- 第?层的初始化完成之后,回到第三层的初始化?法中,依次执?初始化?法,直到本类的初始化?法完成。
5> 指定初始化方法
命名规则:以initWith开头,后面跟上参数列表
1 - (id)initWithName:(NSString *)name gender:(NSString *)gender { 2 self = [super init]; 3 if (self) { 4 _name = name; 5 _gender = gender; 6 } 7 return self; 8 }
3、便利构造器
1> 封装了对象创建过程
内部实现:封装了alloc和初始化操作,创建对象更加?便快捷。
2> 特征
• 便利构造器是 "+" ?法。
• 返回本类型的实例。
• ?法名以类名+ With + 参数列表。
• 可以有 0 到多个参数。
3> 便利构造器声明,实现和调用
声明:
1 + (id)personWithName:(NSString *)name gender:(NSString *)gender;
实现:
1 + (id)personWithName:(NSString *)name gender:(NSString *)gender { 2 3 return [[Person alloc] initWithName:namegender:gender]; 4 5 }
调用:
1 Person *per = [Person personWithName:@"Frank" gender:@"男"];