繼承性是指,在某種情況下,乙個類下面會有乙個子類,這個子類理論上來說會比之前的類(父類)具體化。比如還是「狗」這個類,假設它裡面有乙個成員變數是身高和體重,有乙個方法是咬人。然後再假設這個「狗」類中有「哈士奇」和「金毛」這兩種狗,這兩種狗除了繼承其父類中的成員和方法外,還有自己新增的一些,比如在「哈士奇」這個狗的類中新增了打滾的行為,在「金毛」這個狗的類中新增了賣萌這個行為,這些都是其父類所不具有的,而子類之間所獨有的行為和屬性是不能相互用的,就比如「哈士奇」不能賣萌,因為這是「金毛」私有的。
1.抽取重複**
2.建立了類之間的關係
子類可以擁有父類中的所有成員變數和方法
基本上所有的根類都是nsobject
注意:1.父類必須宣告在子類前面
2.不允許子類和父類有相同名稱的成員變數
3.呼叫某個方法時,優先去當前類中找,如果找不到就會去父類中找
重寫:子類重新實現父類中的某個方法,用來覆蓋父類中以前的做法
每個物件裡預設有個isa指標,指向自己的類,自己的類裡預設也有個supercalss指標,這個指標又指向父類,父類用也有個supercalss指標,這個指標又指向nsobject類
壞處:耦合性太強,即兩個類的關係太緊密,如果父類損壞,子類就用不了
繼承的使用場合:
1.當兩個類擁有相同屬性和方法的時候,就可以將相同的東西抽取到乙個父類中
2.當a類擁有b類中的部分屬性和方法時,可以考慮讓b類繼承a類
組合:和繼承的區別是,繼承是全部擁有,而組合是部分擁有.
基本用法
//設計兩個類bird、dog
// bird的宣告
@inte***ce bird : nsobject
- (void)eat;
@end
// bird的定義
@implementation bird
- (void)eat
@end
// dog的宣告
@inte***ce dog : nsobject
- (void)eat;
@end
// dog的定義
@implementation dog
- (void)eat
@end
有相同的屬性和行為,抽出乙個父類animal(先抽取weight屬性,再抽取eat方法)
// animal的宣告
@inte***ce animal : nsobject
- (void)eat;
@end
// animal的定義
@implementation animal
- (void)eat
@end
子類在父類的基礎上拓充屬性和方法
// bird的宣告
@inte***ce bird : animal
- (void)fly;
@end
// bird的定義
@implementation bird
- (void)fly
@end
// dog的宣告
@inte***ce dog : animal
- (void)run;
@end
// dog的定義
@implementation dog
- (void)run
@end
self是乙個指標,指向當前物件
self->成員變數
訪問當前物件內部的成員變數
[self 方法名];
可以呼叫其他類或者方法
self如果出現在物件方法中,self就代表物件
self如果出現在類方法中,self就代表類
[super 方法名];
直接呼叫父類中的方法
呼叫的方法不僅限於物件方法,類方法也可以
如果super處在物件方法中,那麼就會呼叫父類的物件方法
如果super處在類方法中,那麼就會呼叫父類的類方法
使用場合:子類重寫父類的方法時想保留父類的一些行為
封裝的意義,在於明確標識出允許外部使用的所有成員函式和資料項,或者叫介面。具備封裝性的程式是隱藏了某一方法的具體執行步驟,取而代之的是通過訊息傳遞機制傳送給它。比如說,「狗」這個類中有「吠」這個方法,這個方法定義了狗具體應該如何吠,但是外人並不需要知道它是如何吠的。
封裝是通過限制只有特定類的例項可以訪問這一特定類的成員,而他們通常利用介面實現訊息傳遞。通常來講,成員會根據他們的訪問許可權被分為三種:公有成員(public),私有成員(private),保護成員(protected)。
下面還要在說一下作用作用域型別:
@public
在任何地方都可以訪問物件的成員變數
@private(在類的實現中預設)
只能在當前類的物件方法中直接訪問
@protected(在類的宣告中預設)
能在當前類和子類的物件中直接訪問
@package
只要出於同乙個框架中就能直接訪問物件的成員變數
如何訪問:
@public可以用指標,箭頭和變數名直接訪問,比如:p->_age = 10;
@private在當前類物件方法中,用變數名訪問_height = 90;在其子類中可以用set和get方法訪問,或者點語法
@protected能在當前類和子類的物件方法中直接用變數名訪問_weight = 100;
注:.m檔案中的變數預設就是@private(私有)
為了防止在主函式裡給屬性不規範的賦值
所以去掉@public
然後可以在乙個方法裡給成員變數賦值
這時就用到了set方法
作用:提供乙個方法給外界設定成員變數值,可以在方法裡對引數進行相對應的過濾
命名規範:
1.方法名必須以set開頭
2.set後面跟上成員變數的名稱,成員變數的首字母必須大寫
3.返回值一定是void
4.一定要接收乙個引數,而且引數型別跟成員變數型別一致
5.形參名稱不能和成員變數一樣
get方法
作用:返回物件內部的成員變數
命名規範:
1.有返回值,返回值型別與成員變數型別一致
2.方法名跟成員變數名一樣
3.不需要接收任何引數
成員變數的命名規範
1.一定要以下劃線 _ 開頭
2.可以跟區域性變數區分開,一看到下劃線開頭的變數,一半都是成員變數
類方法:以+開頭
其好處:
不用建立物件,直接執行行為
類方法只能用類呼叫
oc弱語法體現
比如,沒有定義乙個方法,但是卻可以呼叫這個方法,編譯也可以通過
1.過濾不合理的值
2.遮蔽內部的賦值過程
3.讓外界不必關注內部的細節
利用多型建立物件時,呼叫方法時會檢測物件的真實物件,呼叫真實地物件方法
個人理解:
利用其它的類來建立物件
比如a *a = [b do];
其實真正的類還是b
1.沒有整合就沒有多型
2.**的體現:父類型別的指標指向子類物件
3.好處:如果函式/方法引數中使用的是父類型別,可以傳入父類,子類物件
4.侷限性:父類型別的變數不能直接呼叫子類特有的方法,如果想用,必須強制換位子類型別變數後,才能直接呼叫
父類型別的變數不能用來呼叫子類的方法
如果想這麼多,可以利用型別強制轉換
例子:a是父類,d是子類,run是子類方法
a *aa = [d new];
d *dd =(d *)aa; // 將aa轉為d *型別的變數
[dd run];
?
如果引數中使用的是父類型別,可以傳入父類,子類物件,可以節省**
void feed(animal ×a) // 在動物類中建立乙個餵食feed()方法
int main()
// 可以看出不同的物件可以使用同乙個類方法
?
//例子:
#import @inte***ce animal : nsobject
- (void)eat;
@end
@implementation animal
- (void)eat
@end
@inte***ce dog : animal
@end
@implementation dog
- (void)eat
@end
int main()
// 輸出結果為:dog--eating something!!
OC學習之物件導向三大特徵
繼承性是指,在某種情況下,乙個類下面會有乙個子類,這個子類理論上來說會比之前的類 父類 具體化。比如還是 狗 這個類,假設它裡面有乙個成員變數是身高和體重,有乙個方法是咬人。然後再假設這個 狗 類中有 哈士奇 和 金毛 這兩種狗,這兩種狗除了繼承其父類中的成員和方法外,還有自己新增的一些,比如在 哈...
OC物件導向三大特徵 繼承
話接上回 繼續整理,繼續感謝文頂頂大神。oc物件導向三大特點之繼承 一 基本概念 程式的世界和人類的 物件 世界在思想上是沒有什麼區別的,富二代繼承了父母,自如就擁有了父母擁有的所有資源,子類繼承了父類同樣就擁有了父類所有的方法和屬性 成員變數 在這裡動物是貓類和狗類的父類,貓類是黑貓和白貓的父類。...
Java入門之物件導向三大特徵
一 封裝 每個物件包含它能進行操作所需要的所有資訊,這個特性稱為封裝,因此物件不必依賴其他物件來進行自己的操作。將方法 屬性 字段包裝在類中,通過例項化類來生成物件。封裝的好處 1 好的封裝能減少耦合 2 類內部的實現可以自由修改 3 類具有清晰的對外介面 封裝就像建房子,類就是房子,屬性是門窗,欄...