OC_03_InitMethodAndConvenienceConstructorAndInheritance
初始化方法,便利构造器,继承
继承:
继承的目的就是为了节省代码,提高代码的重复利用率
子类继承父类,会继承父类所有的特征和行为,父类的成员变量无论什么可见度都可以被继承,但是私有的成员变量能被继承,但是不能在子类里面进行使用.
当子类继承父类后,父类已有方法,子类可以不用声明,直接实现.
⾯向对象提供了继承语法,能⼤大简化代码。把公共的方法和实例变量写在父类里,子类只需要写自己独有的实例变量和⽅法即可 。继承既能保证类的完整,⼜又能简化代码。
#import <Foundation/Foundation.h>
@interface Person : NSObject //继承了NSObject
#import "Person.h"
@interface Student :Person //Student继承了Person类
OC中只允许单继承。
没有⽗类的类称为根类,OC中的根类是NSObject(上帝)。
继承的内容:所有实例变量和方法。
如果子类不满意父类方法的实现,可以重写(overwrite)父类的⽅方法。
子类重写父类方法前提:子类和父类的方法名必须完全一样.
super是编译器指令,并⾮对象。作用:给super发消息,可以执⾏父类中实现的方法。
⼦类可以重写父类的方法,即:子类既⾃自己的实现,⼜又有父类继承下来的实现,如果想使⽤父类的实现,向super发送消息。
[super walk];//super是本类的对象,用来找自己的父类方法
创建对象分两步:开辟空间、初始化。
初始化方法的主要作用是:为某些实例变量赋初值。
初始化方法在对象的整个生命周期里只使用一次。
学习继承之前,初始化方法,没有self = [super init]字样。我们为实例变量逐一赋值。
学习继承之后,父类中声明了公共的实例变量。作为父类,也应该有自己的初始化方法,为这些公共实例变量赋初值。
⼦类定义了除父类中公共实例变量之外的实例变量。在自身的初始化方法中,优先向super发送init消息,初始化公共变量,初始化成功之后,再初始化自身特有变量,从而完成全部实例变量的初始化。
初始化过程
-
⾃⼰的初始化方法中,优先调用父类的初始化方法。
-
父类的初始化方法中再调用父类的初始化方法,依次往上调用。
-
处于最上层的初始化完成之后,回到第二层的初始化方法中,完成第二层的初始化。
-
第二层的初始化完成之后,回到第三层的初始化⽅方法中,依次执行初始化方法,直到本类的初始化方法完成 。
初始化方法是 “-”⽅法,id或者instancetype类型的返回值,以init开头,可以带0到多个参数
内部实现:先执⾏行super的初始化⽅方法,再初始化⾃自⾝身变量,return self。
例如:
Person.h
@interface Person : NSObject
{
NSString *_name;
NSInteger _age;
NSString *_sex;
}
//自定义初始化方法完整版
- (id)initWithName:(NSString *)name
age:(NSInteger)age
sex:(NSString *)sex;
Person.m
- (id)initWithName:(NSString *)name
age:(NSInteger)age
sex:(NSString *)sex
{
// 初始化父类继承过来的成员变量
self = [super init];
if (self != 0) {
_name = name;
_age = age;
_sex = sex;
}
return self;
}
便利构造器在初始化方法的基础上前进了一小步。封装了对象创建过程。
便利构造器是“+”方法,返回 本类型 的实例,方法名以类名开头。可以有0到多个参数。
内部实现:封装了alloc和初始化方法。使用起来更加简洁。
//便利构造器声明
+ (id)personWithName:(NSString*)name
sex:(NSString*)sex
age:(NSInteger)age;
//便利构造器实现
+ (id)personWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
{
Person *p = [[Personalloc] initWithName:nameage:age sex:sex];
return p;
}
注:initWith是自定义初始化方法,便利构造一般与自定义初始化方法连用,如果没有自定义初始化方法,
则用为Person *p = [[Person alloc] init];
总结
继承是面向对象三大特性之一,合理的继承,能减少很多冗余代码,加快开发速度。
初始化方法以init开头,在对象的声明周期中只使用一次。
便利构造器封装了对象的创建过程,进一步简化了对象创建的步骤。