標籤:style color io 使用 ar strong 檔案 div sp
三大特性:封裝、繼承、多態
封裝: 成員變數的封裝 為了過濾不合法的屬性值,我們需要提供一個方法給外界設定age屬性值
set方法
作用:提供一個方法給外界設定成員變數值
命名:方法名必須以set開頭
set後面跟上成員變數的名稱,成員變數的首字母必須大寫
傳回值一定是void
一定要接收一個參數,而且參數類型跟成員變數類型一致
形參變數的名稱不能和成員變數一樣
get方法:
作用:返回對象內部的成員變數的值
命名規範:
肯定有傳回值,傳回值類型肯定與成員變數類型一致
方法名跟成員變數名一樣
不需要接收任何參數 成員變數盡量不要用@public 枚舉定義方法: typedof enum{ SexMan, SexWoman }Sex;
成員變數的命名規範:一定要以底線 _開頭
作用:
1、讓成員變數和get方法的名稱區分開
2、也可以和局部變數區分開,一看到底線開頭的變數,一般都是成員變數
OC本質上還是C語言,本質上還是麵線過程的。還是弱文法。
沒有聲明沒有實現:
調用沒有聲明的方法編譯的時候只有警告。
只會在啟動並執行時候報錯:
-[Person test]: unrecognized selector sent to instance 0x7fe9804076a0:
給Person對象發送了一個不能識別的訊息:test
有聲明沒有實現:
如果對象聲明了一個方法,但是沒有實現,編譯的時候同樣不會報錯,只會有警告。只有在執行的時候會報錯(錯誤和上面的一樣)。
OC是在運行過程中才會檢測對象有沒有實現相應的方法(動態檢測)
沒有聲明有實現: 這樣寫的話沒有警告,也不會報錯。 程式在運行過程中出錯將會閃退。
類方法:
類方法都是以加號(+)開頭
然後調用的時候直接使用類名調用[Person printClassName]; 類方法只能使用類名調用,不能使用對象調用。
允許類方法的方法名和對象方法的方法名相同
在類方法中不能訪問執行個體變數 對象方法: -》減號 - 開頭 -》只能有對象來調用
-》對象方法中能訪問當前對象的成員變數(執行個體變數) 類方法: -》加號 + 開頭 -》只能由類(名)來調用
-》在類方法中不能訪問執行個體變數
類方法的好處和使用場合:
-》不依賴於對象,執行效率高
-》能用類方法盡量用類方法
-》場合:當方法內部不需要使用到成員變數時,就可以改為類方法
工具類: 基本沒有任何成員變數,裡面的方法基本都是類方法。
self關鍵字
self:誰調用了當前方法,self就代表誰(self如果出現在對象方法中,self代表對象。self如果出現在類方法中,self就代表類)
當成員變數和局部變數同名時,採取就近原則,訪問的是局部變數
用self訪問成員變數,區分同名的局部變數
可以利用"self->成員變數名"訪問當前對象內部的成員變數
可以利用[self 方法名];調用其他的對象方法\類方法
self不管是在類方法還是對象方法中,如果調用自己,那麼就會形成死迴圈
在類方法中的self不能調用對象方法,對象方法中的self不能調用類方法
self不能調用函數
繼承: 繼承的好處: 1、抽取重複代碼 2、建立了類之間的關係 3、子類可以擁有父類中的所有成員變數和方法 注意點:
基本上所有類的根類是NSObject
如果寫在同一個檔案中,那麼父類必須s要寫在前面
OC中不允許子類和父類擁有相同名稱的成員變數
子類重新實現父類的某個方法,不需要像C#中的需要關鍵字
調用某個方法時,優先去當前類中找,如果找不到,就去父類中找
每個類中都有一個superclass指標,指向該類的父類 繼承的壞處:耦合性太強了。
所以繼承不能亂用 繼承的使用場合: 1、當兩個類擁有相同屬性和方法的時候,就可以將相同的東西抽取到一個父類中 2、當A類擁有B類中的部分屬性和方法時,可以考慮讓B類繼承A類 繼承:xx是xxx 組合:xxx擁有xxx 組合:(學生繼承成績,在邏輯上不通,這時候就可以使用組合) @interface Score : NSObject { int _cScore; int _ocScore; } @end @implementation Score @end @interface Student:NSObject {
Score *_score;//這種方式就是組合 int _age; } @end @implementation Student @end
super:
調用父類的方法。(在重寫父類的test方法中想調用父類的test方法或者其他方法,使用[super 方法名])
super處在對象方法中,那麼就會調用父類中的對象方法
super處在類方法中,那麼就會調用父類中的類方法
使用情境:
子類重寫父類的方法時,想保留父類的一些行為
多態
父類指標指向子類對象
沒有繼承就沒有多態
代碼的體現:父類類型的指標指向子類對象
好處:如果函數\方法參數中使用的是父類類型,可以傳入父類、子類對象
局限性:
父類類型的變數,不能直接調用子類特有的方法,必須強轉成子類類型變數後,才能直接調用子類特有的方法。 調用方法的時候會檢測對象的真實形象 如果參數中使用的是父類類型,可以傳入父類、子類對象 多態的局限性:
父類類型的變數,不能用來調用子類的方法。 Dog類繼承自Animal類 Animal *aa=[Dog new]; Dog *dd=(
Dog *)aa
;//強制類型轉換,將aa轉換成Dog *類型的變數 如果有不對的地方請大家指正!!
Objective-C:04_物件導向-三大特性