一. 封裝
在oc中,使用@inte***ce和@implementation來處理類.
@inte***ce像暴露在外面的鐘錶表面,像外界提供展示及介面,
@implementation就好像隱藏在時鐘內部的構造實現,把具體的實現封裝了起來。
封裝的原理:例項變數預設只能被當前類的物件方法訪問。
封裝的目的:防止物件失去對例項變數的管理權。
封裝的作用:
a. 保護資料安全
b.隱藏複雜的內容
c.隔離變化
封裝的實現步驟:定義設定例項變數(setter)和訪問例項變數(getter)的方法
setter方法的作用:為外界提供乙個設定成員變數的值的方法可以監聽屬性的變化
get方法的作用:為呼叫者返回物件內部的成員變數1.setter方法一定是物件方法
2.一定沒有返回值
3.一定以set開頭,且set後面需要設定成員變數的名稱去掉下劃線,並且首字母大寫.
4.一定有引數,引數型別一定和需要設定的成員變數的型別一致,且引數名稱就是成員變數的名稱去掉下劃線
封裝應用的示例**如下(外界只能通過訪問get和set方法訪問物件的成員變數):1.getter方法一定是物件方法
2.一定有返回值,而且返回值一定和成員變數的型別一致.
3.方法名稱就是獲取的成員變數的名稱去掉下劃線.
類的.h檔案中
類的.m檔案中@inte***ce iphone :nsobject
-(void)setsize:(int)size;//setter宣告
-(void)setlength:(double)length;//setter宣告
-(int)size;//getter宣告
-(double)length;//getter宣告
@end
注意:@implemmentation iphone
-(void)setsize:(int)size
-(void)setlength:(double)length;//setter宣告
-(int)size
-(double)length
@end
如果某一屬性只提供了getter方法沒有提供setter方法,我們稱這個屬性為唯讀屬性;
如果某一屬性只提供了setter方法沒有提供getter方法,我們稱這個屬性為只寫屬性;
如果某一屬性同時提供了getter方法和setter方法,我們稱這個屬性為可讀可寫屬性;
如果某一屬性 沒有提供了getter方法沒有setter方法,我們稱這個屬性為私有屬性;
二.自定義快捷鍵
1.-(void)setsize:(int)size;//setter宣告
2.-(int)size;//getter宣告
用法:把第一條語句拖入到右下角框中,編輯edit,size替換為<#name#>,int替換為<#type#> ,size替換為<#name#>.
下次使用快捷鍵就會出現:-(void)setname:(type)name;供選擇;例:nsset;
三.點語法
1.如果給屬性提供了getter和setter方法,那麼訪問屬性就又多了一種方式,點語法
2.點語法本質是呼叫了我們的setter和getter方法.
3.點語法是乙個編譯器的特性,會在程式翻譯成二進位制的時候將,點語法自動轉換為setter和getter方法.
4.如果點語法在=號的左邊,那麼編譯器會自動轉換為setter方法;
5,如果點語法在=右邊,或者沒有等號,那麼編譯器會自動轉換為getter方法;
例子 person * p = [person new];
p.name = @」ok」 等價於[p setname : @」ok」];
四 .self關鍵字
1.如果self在物件方法中,那麼self就代表呼叫當前物件方法的那個物件.
2.如果self在類方法中,那麼self就代表呼叫當前類方法的那個類
注意:
1.self會自動區分類方法和物件方法,如果在類方法中使用self呼叫物件方法,會直接報錯,
2.不能在物件方法或者類方法中利用self呼叫 當前self所在的的方法 ,或出現死迴圈
使用場景:
1.可以用於在物件方法之間進行互相呼叫,
2.可以用於類方法之間進行互相呼叫.
總結:
我們只需要關注self在哪乙個方法中,
如果在類方法中那麼就代表當前的類,
如果在物件方法中那麼就代表當前的物件,
五:繼承
繼承就是子類擁有父類的屬性和方法。派生類不僅包括了基類的方法和屬性,同時派生類可以增加自己的方法和屬性。
繼承的實現:
匯入父類的標頭檔案
宣告類時繼承父類 例:@inte***ce dog:animal //繼承父類屬性
繼承的注意事項:
super關鍵字:1.. 父類的私有屬效能被繼承,但不能被實現
2.. oc中是單繼承,只能繼承乙個父類
3.. 子類不能定義和父類同名的變數,但是可以繼承父類的變數
4. oc中支援多層繼承
重寫:在子類中重新實現父類中已經存在的方法,呼叫方法是會先找子類中是否有該方法,沒有會去父類中找。
1.如果呼叫子類中重寫方法時,子類和父類中存在同名的方法,利用super可以直接跳過子類,呼叫父類同名方法
2.可以利用super在任意方法中呼叫父類的方法.
例:[super ***方法 ];
六. 多型
1.多型在**中的體現,即為某一類事物的多種形態,oc物件具有多型性。必須要有繼承,沒有繼承就沒有多型。概念:不同的物件以自己的方式響應父類同名方法。
在程式中的表現:父類指標指向子類物件.
注意:如果父類指標指向之類物件,如果需要呼叫子類方法,必須先強制型別轉換為子類才能呼叫.
多型的條件:有繼承關係,有方法重寫
多型的原理:動態繫結
多型的優點:簡化了程式設計介面,容許類和類之間重用一些習慣的命名。
2.在使用多型時,會進行動態檢測,以呼叫真實的物件方法。
3.多型在**中的體現即父類指標指向子類物件。
二 多型使用注意person *p = [student new];
p->age = 100;
[p walk]
1.多型的好處
用父類接收引數,節省**
需要乙個新的函式專門用來餵狗
void feed(dog *d)
如果這個時候也需要喂貓,那就應該重寫新乙個新的函式
而狗和貓實際上都繼承自動物這個類,在這裡就可以使用多型來簡化**了。void feed(cat *c)
這裡只需要把函式的引數寫成是animal *型別的,那麼dog和cat型別的物件就都可以傳入進來。
-(void)feed(animal *)a
[person feed :cat/dog]
呼叫的時候直接改變引數就可以了。
2.多型的侷限性
不能訪問子類的屬性(可以考慮強制轉換)
不建議的做法:
解決方法:可以將a強制轉換為dog*型別的變數,如下:animal *a=[[dog alloc] init];
[a run]; // 在animal類中沒有run方法,這裡呼叫了狗物件的方法。
dog *d=(dog *)a; // 使用強制轉換,這裡a和d指向的是同乙個狗物件
3.多型的細節
動態繫結:在執行時根據物件的型別確定動態呼叫的方法
python第三課答案 python第三課
字串操作 s alexwusir s1 s.capitalize 首字母大寫 print s1 全大寫,全小寫 s2 s.upper s21 s.lower print s2,s21 大小寫翻轉 s3 s.swapcase print s3 每個隔開 特殊字元或數字 的單詞首字母大寫 s alex ...
python第三課答案 python第三課筆記
以下哪個變數的命名不正確?為什麼?a mm 520 b mm520 c 520 mm d 520 mm 答 c不正確,不能數字開頭 在不上機的情況下,以下 你能猜到螢幕會列印什麼內容嗎?myteacher 小甲魚 yourteacher myteacher yourteacher 黑夜 print ...
python第三課答案 python第三課
1.迴圈物件,主要呼叫next 2.迭代器iterator 在理解上可以和迴圈物件理解為乙個東西。3.生成器 generator 自定義的迴圈物件。4.表推導 list comprehension 是快速生成表的方法。表推導用中括號。l x 2 for x in range 10 練習 f open...