OC學習之物件導向三大特徵

2021-06-27 13:23:05 字數 4325 閱讀 3427

繼承性是指,在某種情況下,乙個類下面會有乙個子類,這個子類理論上來說會比之前的類(父類)具體化。比如還是「狗」這個類,假設它裡面有乙個成員變數是身高和體重,有乙個方法是咬人。然後再假設這個「狗」類中有「哈士奇」和「金毛」這兩種狗,這兩種狗除了繼承其父類中的成員和方法外,還有自己新增的一些,比如在「哈士奇」這個狗的類中新增了打滾的行為,在「金毛」這個狗的類中新增了賣萌這個行為,這些都是其父類所不具有的,而子類之間所獨有的行為和屬性是不能相互用的,就比如「哈士奇」不能賣萌,因為這是「金毛」私有的。

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 類具有清晰的對外介面 封裝就像建房子,類就是房子,屬性是門窗,欄...