標籤:style class blog code http color
繼承、初始化方法
一、繼承
繼承的上層:父類 繼承的下層:子類
繼承是單向的,不能相互繼承
繼承具有傳遞性:A繼承於B,B繼承於C,A具有B和C的特徵和行為
子類能繼承父類全部的特徵和行為(私人變數也繼承過來了,只是不能訪問)
物件導向提供了繼承文法。能大大簡化代碼,把公用的方法和執行個體對象寫在父類裡。子類只需要寫自己專屬的執行個體變數和方法即可
繼承既能保證類的完整,又能簡化代碼
繼承特點
oc中只允許單繼承
沒有父類的類稱為根類,oc中得根類是NSObject(祖宗)
繼承的內容:所有的執行個體變數和方法
如果子類不滿意父類方法的實現,可以重寫父類的方法
繼承樹
繼承中方法的執行
super 關鍵字
super是編譯器指令,並?對象。
作用:給super發訊息,可以執??類中實現的?方法。
?類可以重寫?類的?法,即:?類既有自己的實現,?有父 類繼承下來的實現,如果想使?用父類的實現,向super發送訊息
//重寫sayHi方法- (void)sayHi{ [super sayHi];//調用父類sayHi方法 NSLog(@"ok");}
- (void)study//學習{ [super sayHi];//調用父類sayHi方法 [self sayHi];//調用自身sayHi方法 NSLog(@"%@ 我正在努力學習",_name);}
二、初始化方法
建立對象分兩步:開闢空間、初始化。
初始化?方法的主要作?用是:為某些執行個體變數賦初值。
初始化?方法在對象的整個?生命週期?裡只使?用?一次。
- (instancetype)initwithName:(NSString *)name sex:(NSString *)sex number:(NSInteger)number;//instancetype取代id- (id)initwithName:(NSString *)name sex:(NSString *)sex number:(NSInteger)number;
//初始化的時候,優先調用父類的初始化方法,初始化父類中的變數,然後在初始化自己的變數。
//每個類都清楚自己專屬的變數,因此。初始化方法裡僅僅初始化自己專屬的變數,通過調用父類的初始化方法,初始化繼承過來的變數
///經過一番調用之後,繼承樹上的所有變數都可以得到初始化
//最不科學的初始化方法:在子類裡面,為每一個變數賦值,因為,你需要自己查閱都繼承了哪些變數。
?類定義了除?類中公用執行個體變數之外的執行個體變數。在自身的初始 化方法中,優先向super發送init訊息,初始化公開變數,初始化成 功之後,再初始化?身特有變數,從?完成全部執行個體變數的初始化。
初始化過程
1. 執?行?父類中實現的初始化?方法。(向上遞迴到NSObject類中的初始化?方法)
2. 從根類NSObject開始執?行初始化?方法。
3. 判斷?父類中的初始化是否成功,即self是否存在。
4. 完成對象的初始化設定,返回對象。
5. 初始化?子類執行個體變數。
初始化方法特徵
初始化?方法是 “-”?方法
id或者instancetype類型的傳回值
以init開頭
可以帶0到多個參數 內部實現:先執?行super的初始化?方法,再初始化?自?身變數,return self。
三、便利構造器
便利構造器在初始化方法的基礎上前進了?小步。
封裝了對象建立過程。
便利構造器是“+”?法,返回本類型的執行個體,?法名以類名開頭。
可以有0到多個參數。 內部實現:封裝了alloc和初始化?法。使?用起來更加簡潔
實現函數中代碼
+ (Student *)studentWithName:(NSString *)name sex:(NSString *)sex hobby:(NSString *)hobby age:(NSInteger)age number:(NSInteger)number{ return [[Student alloc] initWithName:name sex:sex hobby:hobby age:age number:number];}
主函數內代碼 Student *student1 = [Student studentWithName:@"wangw" sex:@"man" hobby:@"xuexi" age:18 number:12];