黑馬程式設計師—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詳解之Object、Scanner、String
------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ------- A:Object類 Object類是所有類的根類,其所有的方法為所有類所共有,所以很多類的基本功能都是依賴於Object實現的。 如: 無參構造方法(Object只有無參
黑馬程式設計師:IO 學習
* 這個時候,我們又重寫在Person類裡面修改了一個成員變數的修飾符,一旦修改,這個標記號就會改動。也就是現在的:serialVersionUID = -241056507998041204 * 我們再次讀取資料的時候,class中的標記號和檔案中的標記號不一致了,就導致了現在的問題。 * class