一:繼承
物件導向的三大特徵:封裝(函式的定義封裝)、繼承(子類繼承父類的例項變數和方法)、多型(下面會介紹)
繼承的特點如下:
1、繼承父類所有的例項變數和方法
2、繼承具有單一性,只能繼承於乙個父類
3、不能相互繼承,你和我不可以互相繼承(單向性)
4、可以重寫(overwrite)父類的方法
5、特有的例項變數寫在子類裡面去宣告
6、繼承具有傳遞性,子類不僅僅繼承父類的例項變數和方法,還繼承父類的父類的父類的~~~的例項變數和方法
(一:怎樣使用?)如:student類繼承person類,具有person類的所有例項變數和方法,還具有自己特有的例項變數和方法。
@inte***ce person : nsobject
在student類裡面再宣告自己特有的例項變數
//再宣告在父類裡面沒有的set和get方法
-(void)setnumber:(nsinteger)number;
-(nsinteger)number;
-(void)setscore:(cgfloat)score;
-(cgfloat)score;
在main.m檔案裡面,student建立的物件可以任意呼叫父類的方法和例項變數
student *stu=[student alloc];
[stu initwithname:@"紅紅" ***:@"女" age:23 number:12 score:89];
[stu sayhi];
(二:怎樣重寫方法?)如果子類想用父類的方法,但又要修改一下,則,無需在.h檔案裡面再次宣告,只需要在student.m檔案裡面修改就可以了,如下:
注意:父類方法重寫,無需在子類的.h檔案裡面再宣告了,只需要重寫方法就可以了,一般呼叫方法,會先到到本類去找,再到父類去找,再到父類的父類去找
-(void)sayhi
然後再次呼叫該方法sayhi就會輸出學生特有的方法。
二:多型
(1)多個子類繼承於同乙個父類,或者子類的子類的子類都呼叫父類的父類的同乙個方法,並都重寫了父類的方法,變成具有自己特色的方法,則就實現了,不同物件呼叫同乙個方法名會有不同的結果的現象,成為多型! 如:
[per sayhi];
結果: 您好,我是小花,我的性別是女的,年齡是12
[stu sayhi];
結果:您好,我是紅紅,我的性別是女,年齡是23
學生的姓名是紅紅,在oc中考了89.000000分
[cstu sayhi];
結果:您好,我是豬八戒,我的性別是男,年齡是23
學生的姓名是豬八戒,在oc中考了89.000000分
學院是文學院,專業是語文
(2)多型的第二種現象:(不是很懂)
//多型的另一種表現,父類指標可以指向子類的物件
[cstu fallinlovewith:[stu name]];
[cstu fallinlovewith:[per name]];
通常來說,子類總是含有一些父類沒有的成員變數,或者方法函式。而子類肯定含有父類所有的成員變數和方法函式。所以用父類指標指向子類時,沒有問題,因為父類有的,子類都有,不會出現非法訪問問題。
但是如果用子類指標指向父類的話,一旦訪問子類特有的方法函式或者成員變數,就會出現非法,因為被子類指標指向的由父類建立的物件,根本沒有要訪問的那些內容,那些是子類特有的,只有用子類初始化物件時才會有。
三:初始化方法
初始化方法的作用:在繼承父類的例項變數,不想又要重新定義初始化方法。如下:
//(1)、由於想要重寫父類的初始化方法,則需要用到指定初始化方法、自定義初始化方法
//自定義初始化方法:
-(instancetype)initwithname:(nsstring *)name ***:(nsstring *)*** age:(nsinteger)age number:(nsinteger)number score:(cgfloat)score
//(2)、由於上面有一些東西已經寫過,還是比較麻煩,於是又有下面的初始化方法
-(instancetype)initwithname:(nsstring *)name ***:(nsstring *)*** age:(nsinteger)age number:(nsinteger)number score:(cgfloat)score
return self;}
四:便利構造器
便利構造器的作用是:方便定義多個物件時,無需重複為每個物件申請分配空間和初始化,只要是屬於同乙個類的物件都可以用一句話建立。
步驟:(1)在某一類的.h檔案裡面編寫**宣告:
//便利構造器(+)開頭的(因此是乙個類方法),格式:+類名(小寫開頭)+例項變數+引數(包括父類的三個引數在內所有例項變數)
+(instancetype)studentwithname:(nsstring *)name ***:(nsstring *)*** age:(nsinteger)age number:(nsinteger)number score:(cgfloat)score;
(2)在某一類的.m檔案裡面編寫實現建立物件的方法過程:
便利構造器(+)開頭的,格式:+類名(小寫開頭)+例項變數+引數
+(instancetype)studentwithname:(nsstring *)name ***:(nsstring *)*** age:(nsinteger)age number:(nsinteger)number score:(cgfloat)score
(3)在main.m檔案裡面使用便利構造器來建立多個上面所說的類的物件
//建立student的多個類
student *stu1=[student studentwithname:@"張三" ***:@"男" age:23 number:12 score:89];
student *stu2=[student studentwithname:@"李四" ***:@"男" age:23 number:45 score:68];
//呼叫方法
[stu1 sayhi];
[stu2 sayhi];
五、self的作用
-(instancetype)initwithname:(nsstring *)name ***:(nsstring *)*** age:(nsinteger)age
nslog(@"例項方法中,self的位址是%p",self);//例項方法中self指當前呼叫該方法的物件的位址
return self;//self是當前類的物件,呼叫本方法的物件,如果在+加號方法裡面,則表示在類方法中,self表示當前類}
(2)在類方法(+加號方法裡面)中self表示的是乙個當前的類,如下驗證:
//便利構造器,相當於把建立物件的alloc和init封裝起來
+(instancetype)personwithname:(nsstring *)name ***:(nsstring *)*** age:(nsinteger)age
結果輸出:在類方法中,self=person
iOS OC03 繼承,便利構造器,初始化方法
zombie.h oc03 繼承,便利構造器,初始化方法 created by dllo on 15 7 16.import inte ce zombie nsobject 特徵 行為 對方法的重寫 void walk void attack void dead 自定義初始化方法的宣告 id ini...
Objective C 繼承,初始化方法
一.繼承 1.繼承的上層 父類,繼承的下層 子類 2.繼承是單向的 3.繼承具有傳遞性 子類繼承父類的特徵和行為 4.子類擴充套件父類,更加具體 oc中的繼承 1.oc中的繼承,即乙個類繼承另乙個類 2.被繼承的類稱為父類或超類 3.繼承的類為子類 繼承的特點 1.oc中只允許單繼承 2.沒有父類的...
OC之繼承 初始化方法
一 繼承 繼承的上層 父類,繼承的下層 子類。繼承是單向的,不能相互繼承。繼承具有傳遞性 a繼承於b,b繼承於c,a具有b和c的特徵和行為。子類能繼承父類全部的特徵和行為。因為沒有,所以所有。物件導向提供了繼承語法,能大大簡化 把公共的方法和例項變數 寫在父類裡,子類只需要寫自己獨有的例項變數和方法...