一、繼承
面向對象的三大特性:封裝,繼承,多態(tài)。
?向對象提供了繼承特性。
繼承既能保證類的完整,又能簡化代碼。
面向對象所提供的繼承特性可以大大簡化代碼。把公共的?法和實例變量寫在父類里,子類只需要寫?己獨有的實例變量和方法即可。
繼承的特點
沒有父類的類稱為根類,OC中的根類是NSObject(祖宗)。
繼承的上層:父類,繼承的下層:子類。
繼承的內(nèi)容:所有實例變量和方法。
繼承是單向的,不能相互繼承。
繼承具有傳遞性:A繼承于B,B繼承于C,A具有B和C的特征和?為。
如果子類不滿意父類方法的實現(xiàn),可以重寫(overwrite)父類的方法。
super
super是編譯器指令,并非對象。
作?:給super發(fā)消息,可以執(zhí)?父類該?法的實現(xiàn) 。
重寫從父類繼承過來的方法的三種情況:
完全以子類的實現(xiàn)內(nèi)容為主,丟棄父類實現(xiàn)的內(nèi)容。
完全以父類的實現(xiàn)內(nèi)容為主,沒有子類實現(xiàn)的內(nèi)容。
既有父類對該方法的實現(xiàn),也有子類對該方法的實現(xiàn)。
二、初始化方法
創(chuàng)建對象分兩步:
1.為對象開辟空間。
2.進行初始化操作。
初始化?法的主要作用是:為某些實例變量賦初值。
初始化?法在對象的整個?命周期?只使?一次。
注:初始化方法是在對象的初始化階段完成其實例變量的賦值操作,一個對象的初始化階段只有一次,所以初始化方法只使用一次。
1.重寫init方法
- (id)init {
//給super發(fā)送init消息:執(zhí)行父類中實現(xiàn)的init方法
self = [super init];//self是系統(tǒng)關鍵字。 self在方法中指代當前方法的調(diào)用者。
//判斷從父類繼承過來的init方法是否初始化成功
if (self) {
//初始化設置
}
//返回初始化完成的對象
return self;
}
?類定義了除?類中公共實例變量之外的實例變量。
在?身的初始化?法中,優(yōu)先向super發(fā)送init消息,初始化公共變量,初始化成功之后,再初始化?身特有變量,從?完成全部實例變量的初始化。
2.自定義initWith方法
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age{
//調(diào)用父類初始化方法
self =[super init];
if (self) {
//初始化設置
}
//返回初始化完成的對象
return self;
}
初始化?法以init開頭,在對象的生命周期中只使?一次。
三、便利構造器
封裝了對象創(chuàng)建過程:
內(nèi)部實現(xiàn):封裝了alloc和初始化操作,創(chuàng)建對象更加方便快捷。
便利構造器是“+”方法。
返回 本類型 的實例。
?法名以類名開頭。
可以有0到多個參數(shù)。
便利構造器實現(xiàn)和使用
聲明
(id)personWithName:(NSString *)name gender:(NSString *)gender;
實現(xiàn)
+ (id)personWithName:(NSString *)name gender:(NSString *)gender {
return [[Person alloc] initWithName:name gender:gender];
}
調(diào)用
Person *per = [Person personWithName:@"Frank" gender:@"男"];
便利構造器封裝了對象的創(chuàng)建過程,進?步簡化了對象創(chuàng)建的步驟。
