《IOS OC》繼承 多型 初始化方法 便利構造器

2021-07-05 03:34:18 字數 3462 閱讀 1949

一:繼承

物件導向的三大特徵:封裝(函式的定義封裝)、繼承(子類繼承父類的例項變數和方法)、多型(下面會介紹)

繼承的特點如下:

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的特徵和行為。子類能繼承父類全部的特徵和行為。因為沒有,所以所有。物件導向提供了繼承語法,能大大簡化 把公共的方法和例項變數 寫在父類裡,子類只需要寫自己獨有的例項變數和方法...