1. 程式人生 > >黑馬程式設計師—Objective-C學習—封裝、繼承、多型

黑馬程式設計師—Objective-C學習—封裝、繼承、多型

三大特性:成員變數的封裝、繼承、多型

一、封裝

寫成員變數時,不要寫@public,應使用set方法。成員變數儘量不要用@public,不讓外界直接訪問應提供一個方法給外界設定和訪問成員變數的值。即set方法和getf方法。

1、set方法

a、作用:提供一個方法給外界設定成員變數值,可以在方法裡面對引數進行相應過濾;

b、命名規範:

(1)、方法名必須以set開頭;

(2)、set後面跟上成員變數的名稱,成員變數的首字母必須大寫;

(3)、形參名稱不能跟成員變數同名;

(4)、返回值一定是void;

(5)、一定要接收一個引數,而且引數型別跟成員變數型別一致;

2、get方法

a、作用:返回物件內部的成員變數

b、命名規範:

(1)、肯定有返回值,返回值型別肯定與成員變數一致;

(2)、方法名跟成員變數名一樣;

(3)、不需要接收任何引數;

3、只允許外界訪問成員變數,不允許外界修改成員變數(只讀readonly),只需提供get方法;

      只允許外界修改成員變數,不允許外界訪問成員變數,只需提供set方法;

4、封裝的好處

(1)、過濾不合理的值;

(2)、遮蔽內部的賦值過程;

(3)、讓外界不必關注內部的細節;

5、成員變數的命名規範:一定要以下劃線 _ 開頭。好處:

a) 可以跟get方法的名稱區分開;

b) 可以跟區域性變數區分開,一看到下劃線開頭的變數,一般都是成員變數;

6、弱語法

呼叫未定義的方法時,編譯有警告,連結可以通過,執行時報錯,閃退

//-[Student test]: unrecognized selector   sent to instance 0x7fce28c09710;

//給Student物件傳送了一條不能識別的訊息:test

OC在執行過程中才會檢測物件有沒有實現相應方法(動態檢測)

7、setter和getter例項

#import <Foundation/Foundation.h>

@interface Student : NSObject

{

int _age; 

//set方法

- (void)setAge :(int)newAge;

//get方法

- (int)age;

- (void)study;

@end

@implementation Student

//set方法的實現

- (void)setAge :(int)newAge

{

//對傳進來的引數進行過濾

if(newAge <=0)

    {

        newAge = 1;

    }

    _age = newAge;

}

//get方法的實現

- (int)age

{

return _age;

}

- (void)study

{

    NSLog(@"%d歲的學生在學習", _age);

}

@end

int main()

{

    Student *stu = [Student new];

    [stu setAge:10];

    [stu study];

    NSLog(@"學生的年齡是%d歲", [stu age]);

/*

     //-[Student test]: unrecognized selector   sent to instance 0x7fce28c09710;

     //給Student物件傳送了一條不能識別的訊息:test

     [stu test];

    */

return0;

}

8、類方法

a、概念:直接可以用類名來執行的方法(類本身會在記憶體中佔據儲存空間,裡面有類/物件方法列表);

b、類方法定義:類方法都是以 + 開頭;

c、1>類方法只能用類來呼叫,不能用物件呼叫;

     2>物件只能呼叫物件方法(-),類不能呼叫物件方法;

     3>可以允許類方法跟物件方法同名;

     4>類方法內能呼叫其他的類方法,物件方法內也能呼叫類方法; 

     5>類方法不能呼叫自己,會引發死迴圈;

d、類方法和物件方法區別:

物件方法:

(1)、減號 – 開頭;

(2)、只能由物件呼叫;

(3)、物件方法中能訪問當前物件的成員變數;

類方法:

(1)、加號 + 開頭;

(2)、只能由類(名)呼叫;

(3)、成員變數不能在類方法中訪問;

e、類方法的好處和使用場合

(1)、不依賴於物件,執行效率高;

(2) 、能用類方法儘量用類方法;

(3) 、場合:當方法內部不需要使用成員變數時,就可以改為類方法;

f、工具類:基本沒有任何成員變數,裡面的方法基本都是類方法;

g、類方法例項

#import <Foundation/Foundation.h>

@interface Person : NSObject

//類方法都是以+開頭

+ (void)printClassName;

- (void)test;

@end

@implementation Person

+ (void)printClassName

{

    NSLog(@"這個類叫做Person");

}

- (void)test

{

    NSLog(@"呼叫了test方法");

    [Person printClassName];

}

@end

int main()

{

/*

     Person *p = [Person new];

     //系統會認為現在呼叫的printClassName是個物件方法

     [p printClassName];這個是錯誤的,報不能識別訊息錯誤,他找的是物件方法(-),在物件裡面找printClassName物件方法

    */

     [Person printClassName];

/*

     //系統會認為現在呼叫的test是個類方法

     [Person test];//在類裡面找test,找不到test類方法

    */

return 0;

}

h、self關鍵字

(1)、self是個指標,指向呼叫當前方法內變數,代表著當前變數。

(2)、誰呼叫了當前方法,self就代表誰;self出現在物件方法中,self代表物件,self出現在類方法中,self代表類;

(3)、在物件方法中,可以利用“self->成員變數名”訪問當前物件內部的成員變數;

         [self 方法名],可以呼叫其他物件方法或類方法。

二、繼承

1、概念:某一個類A繼承另一個類B,就可以擁有那個類的所有成員變數和方法。

1>A叫做子類,B叫做父類;

2>所有的類最終繼承根類,根類(最基本的類):NSObject

3>每個類中都有一個superclass指標指向父類;

2、繼承的好處:

a、抽取重複程式碼,不改變原來模型的基礎上,拓充程式碼;

b、建立了類之間的關係;

c、子類可以擁有父類中的所有成員變數和方法。

3、繼承的使用場合

a、當兩個類擁有相同屬性和方法的時候,就可以將相同的東西抽取;

b、當A類完全擁有B類中的部分屬性和方法時,可以考慮讓B類繼承A類;

4、繼承的專業術語

1>父類\超類    superclass

2>子類   subclass\subclasses

5、繼承的注意點

a、單繼承

b、不允許子類和父類擁有相同名稱的成員變數;

c、子類可以重寫父類的方法,子類重新實現父類中的某個方法,覆蓋父類以前的做法;

1>父類必須宣告在子類之前;

2>呼叫某個物件的方法時,優先去當前物件中找,如果找不到,去父類中找;

d、繼承的壞處:耦合性太強(類之間的關係太緊密);

6、繼承例項

#import <Foundation/Foundation.h>

/********Animal********/

@interface Animal : NSObject

{

int _age;

double _weight;

}

- (void)setAge:(int)age;

- (int)age;

- (void)setWeight:(double)weight;

- (double)weight;

@end

@implementation Animal

- (void)setAge:(int)age

{

    _age = age;

}

- (int)age

{

return _age;

}

- (void)setWeight:(double)weight

{

    _weight = weight;

}

- (double)weight

{

return _weight;

}

@end

/********Dog********/

// : Animal 繼承了Animal, 相當於擁有了Animal裡面的所有成員變數和方法

//Animal稱為Dog的父類

//Dog稱為Animal的子類

@interface Dog : Animal

@end

@implementation Dog

@end

/********Cat********/

@interface Cat : Animal

@end

@implementation Cat

@end

int main()

{

    Dog *d = [Dog new];

    [d setAge:10];

    NSLog(@"age = %d",[d age]);

return0;

}

7、super作用:

a、直接呼叫父類中的某個方法

b、super處在物件方法中,那麼就會呼叫父類的物件方法

   super處在類方法中,那麼就會呼叫父類的類方法

c、使用場合:子類重寫父類的方法時想保留父類的一些行為

8、繼承和組合的區分:

繼承:XX是XXX;組合:XX擁有XXX;

繼承:

@interface A : NSObject

{

int _age;

}

@end

@interface B : A

{

int _weight;

}

@end

組合:

@interface A : NSObject

{

int _age;

}

@end

@interface B : NSObject

{

A _a;

int _weight;

}

@end

三、多型

1、基本概念:某一類事物的多型性,OC物件具有多型性

2、沒有繼承就沒有多型;

a、程式碼體現:用父類型別的指標指向子類物件;

b、呼叫方法時,會檢測物件的真實型別,呼叫的是真實型別的方法。

3、多型的好處:當遇到多個函式,每個方法相差不大,用父類接收引數,節省程式碼。(將多個函式合成一個函式)

4、多型的侷限性:父類型別的變數,不能用來呼叫子類特有的方法。必須強轉為子類型別變數後,才能直接呼叫子類特有的方法。

5、多型例項:

#import <Foundation/Foundation.h>

@interface Animal : NSObject

- (void)eat;

@end

@implementation Animal

- (void)eat

{

    NSLog(@"Animal--吃東西----");

}

@end

@interface Dog : Animal

- (void)run;

@end

@implementation Dog

- (void)eat

{

    NSLog(@"Dog--吃東西----");

}

- (void)run

{

    NSLog(@"Dog--跑起來----");

}

@end

@interface Cat : Animal

@end

@implementation Cat

- (void)eat

{

    NSLog(@"Cat--吃東西----");

}

@end

//如果引數中使用的是父類的型別,可以傳入父類、子類的物件

void feed(Animal *a)

{

    [a eat];

}

int main()

{

    Dog *d = [Dog new];

    [d run];

    Animal *aa = [Dog new];

//多型的侷限性:父類型別的變數不能用來呼叫子類的方法

//[aa run];

//將aa轉為Dog *型別的變數

    Dog *dd = (Dog *)aa;

    [dd run];

/*

    Dog *dd = [Dog new];

    feed (dd);

    Cat *cc = [Cat new];

    feed(cc);

     */

/*

    //多種形態

    Dog *d = [Dog new];//Dog型別

    [d eat];

    //多型:父類指標指向子類物件

    Animal *a = [Dog new];

    //呼叫一個方法時會檢測物件的真實型別

    [a eat];

    */

return 0;

}

相關推薦

黑馬程式設計師Objective-C學習封裝繼承

三大特性:成員變數的封裝、繼承、多型 一、封裝 寫成員變數時,不要寫@public,應使用set方法。成員變數儘量不要用@public,不讓外界直接訪問應提供一個方法給外界設定和訪問成員變數的值。即set方法和getf方法。 1、set方法 a、作用:提供一個方法給外界

黑馬程式設計師---面向物件上(封裝繼承)

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! 面向物件(Object-Oriented,簡稱OO)

黑馬程式設計師Objective-C學習—類和物件的記憶體管理

b、如果有上百個標頭檔案都#import了同一個檔案,或者這些檔案依次被#improt,那麼一旦最開始的標頭檔案稍有改動,後面引用到這個檔案的所有類都需要重新編譯一遍,而相對來 講,使用@class方式就不會出現這種問題了

黑馬程式設計師Objective-C筆記:封裝繼承

例子: #import @interface Animal : NSObject - (void)eat; @end @implementation Animal - (void)eat { NSLog(@"Animal---Eating something!!"); } @end

黑馬程式設計師Objective-C筆記:點語法

一.點語法本質 點語法的本質的本質還是方法的呼叫,不是訪問成員變數。當編譯器遇到點語法時,自動轉化成相應的語法。 二.例項應用 P.age=10; =[P setAge:10] set方法,設定成員變數的值  int a = P.age=[P age]  get方法,

黑馬程式設計師Objective-C筆記:類

#import //包含主標頭檔案,因為後面用到了NSobject @interface Person : NSObject //在這裡冒號表示繼承,讓person繼承NSobject的目的是讓Person這個類具備建立物件的能力 { // 這裡宣告屬性(預設情況初始化是0),成員變

C#基礎封裝繼承

一、封裝 C#中可使用類來達到資料封裝的效果,這樣可以使資料與方法封裝成單一元素,以便於通過方法存取資料。除此之外,還可以控制資料的存取方式。 在面向物件程式設計中,大多數都是以類作為資料封裝的基本單位。類將資料和操作資料的方法結合成一個單位。設計類時,不希

C#08(封裝繼承)

封裝,繼承,多型 一、封裝 C#中可使用類來達到資料封裝的效果,這樣可以使資料與方法封裝成單一元素,以便於通過方法存取資料。除此之外,還可以控制資料的存取方式。 在面向物件程式設計中,大多數都是以類作為資料封裝的基本單位。類將資料和操作資料的方法結合成一個單位。

c++學習筆記(13) 繼承

繼承:從已有的類派生出新類 基類和派生類 不同的類之間可能有很多共通的屬性和行為,這些屬性和行為允許在一個類中通用化並被其他類所共享。類C1從類C2擴充套件而來,則C1稱為派生類,C2稱為基類,基類也稱為父類或者超類,派生類稱為子類,一個子類繼承了其父類所有可訪問的資料域和函式。同時可以增加

黑馬程式設計師C/C++學習路線圖已上線!一圖在手,天下我有!

一張詳盡的C/C++學習路線圖囊括所有學習資源,其包括: 教學視訊+配套原始碼+大牛筆記+破解版工具+各大名企面試題,等等。 實時更新,完全免費,一圖在手,天下我有! C/C++學習路線圖,連結:www.itheima.com/cmap   歷時一個月,在幾位老師的共同

黑馬程式設計師C#程式設計基礎學習筆記:不斷要求使用者輸入一個數字,然後列印這個數字的二倍,當用戶輸入q的時候程式退出。

--------------------------------------------------- 2345王牌技術員聯盟、2345王牌技術員聯盟、期待與您交流!-----------------------------------------------------

黑馬程式設計師——Object-C的基礎學習——語言特性

lt;a target=_blank href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 初衷:       生平第一

黑馬程式設計師C語言基礎-指標

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、

黑馬程式設計師C++學科推出全新三大實戰專案

7月中旬,黑馬程式設計師C++學科課程研發精英團隊推出了全新的三大實戰專案,完全貼合一線企業大型專案開發。黑馬程式設計師將帶你經歷整個專案開發流程,每個專案的市場值都在15k以上,只要掌握這三門“武功”,便可輕鬆拿到名企offer,在C++行業獨步天下!       

黑馬程式設計師-----IO的學習

------- android培訓、java培訓、期待與您交流! ---------- IO的學習 字元流中的基本父類:Writer和Reader Writer中有OutputStreamWriter中的FileWriter用於操作檔案。 FileWriter fw=new

黑馬程式設計師 IO流學習筆記一

----------android培訓、java培訓、java學習型技術部落格、期待與您交流!---------- JavaI/O IO的發展 I/O是機器獲取或交換資訊的主要渠道。 從JDK1.4開始引入了NIO(以塊為單位傳輸資料,新增非同步通訊)。 從J

黑馬程式設計師_java基礎學習筆記之(建構函式&構造程式碼塊&靜態程式碼塊)的區別

在基礎學習中,我常常會概念模糊,特作此學習筆記,進行一下對比,思路自然就清晰了。 建構函式 建構函式定義:建構函式是與類名相同,但沒有返回值的函式。 例子: class Person {     //建構函式     public Person() {} } 作用:

黑馬程式設計師——java基礎學習筆記——第二天

1..常量與變數: 常量表示不能改變的數值。Java中常量的分類: 1.整數常量。所有整數2.小數常量。所有小數3.布林型常量。較為特有,只有兩個數值。true false。4.字元常量。將一個數字字母或者符號用單引號( ' ' )標識。5.字串常量。將一個或者多個字元

黑馬程式設計師——常用API詳解之ObjectScannerString

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ------- A:Object類 Object類是所有類的根類,其所有的方法為所有類所共有,所以很多類的基本功能都是依賴於Object實現的。 如: 無參構造方法(Object只有無參

黑馬程式設計師:IO 學習

 * 這個時候,我們又重寫在Person類裡面修改了一個成員變數的修飾符,一旦修改,這個標記號就會改動。也就是現在的:serialVersionUID = -241056507998041204  * 我們再次讀取資料的時候,class中的標記號和檔案中的標記號不一致了,就導致了現在的問題。  * class