標籤:
物件導向的特徵:
1)封裝 2)繼承 3)多態
知識點:
(1)set/get方法(成員變數的封裝)
(2)構造方法
(3)self的使用
(4)對象方法和類方法
小知識點補充
(一)set/get方法
【set】:用形參給成員變數賦值
【get】:返回成員變數的值
程式碼範例
#import <Foundation/Foundation.h>// 聲明@interface Car : NSObject{ //@public // 以後的成員變數最好不要寫@public, // 因為@public修飾的成員變數可以被別人亂改 int _wheels; // 輪子個數 // 成員變數的命名規範 // 成員變數都以底線 _ 開頭 // 1.可以跟get方法的名稱區分開 // 2.一看到底線開頭的變數,肯定是成員變數
/* set方法 1.作用:用來設定成員變數,可以在方法裡面過濾掉一些不合理的值 2.命名規範: 1> 方法都是以set開頭,而且後面跟上成員變數名,成員變數名的首字母必須大寫 2> 形參名稱不要跟成員變數同名3.因為只是提供方法設定值,所以,傳回值為void */- (void) setWheels:(int)newWheels;/* get方法 1.作用:返回對象內部的成員變數 2.命名規範: 1> get方法的名稱一般就跟成員變數同名3.因為get方法是要取得成員變數的值,所以傳回值類型,和成員變數類型相同 */- (int) wheels;// 跑- (void) run;@end@implementation Car// 跑的實現- (void) run{ NSLog(@"%i個輪子的車跑起來了!", wheels);}// set方法的實現- (void) setWheels:(int)newWheels{ // 對外面傳進來的輪子數進行過濾(當我們需要過濾資料時) if (newWheels<=0) { newWheels = 1; } _wheels = newWheels; // 一般就寫這一句就行了}// get方法的實現- (int) wheels { return _wheels;}@endint main(){ Car *car = [Car new]; // car->wheels = -10; 當@public時,才能使用此方法直接設定值 // 通過set方法設定Car對象的_wheels成員變數 [car setWheels:-100]; [car run]; // [car wheels]通過get方法獲得Car對象的_wheels成員變數 NSLog(@"輪子個數:%i", [car wheels]); return 0;}
補充
// 多個-(void)setAge:(int)a AndWeight:(int)w AndHeight:(int)h{//方法一:直接給成員變數賦值 // _age = a;// _weight = w;// _height = h;//方法二:封裝成員變數的setter 方法 [self setAge:a]; //self == wangcai [self setWeight:w]; [self setHeight:h]; }
(二)構造方法
(初始化對象)
1.構造方法有兩種
(1)系統提供的預設的構造方法
(2)自訂的構造方法
2.
>在一般語言建立對象或者變數的時候系統自動去調用的方法叫做構造方法(這個概念瞭解就行,重點在下面)
遺憾的是OC在建立對象的時候不會自動調用構造方法
>構造方法的作用:在建立對象的時候對對象的成員變數做初始化
>OC中,凡是以init開頭的方法 都是構造方法
>構造方法分為無參構造方法,和帶參的構造方法
一個類可以有多個構造方法,在建立對象的時候根據需求去選擇調用構造方法
3.1【無參構造方法】
聲明的格式 :-(當前類 類型的指標 *)init;
實現的格式:
-(Dog *)init{
self = [super init];
if (self != nil) {
_name = @"Tom";
_age = 0;
}
return self;
}
【注】:一個完整的對象分為父類和當前類兩部分,初始化的時候要
1)先去通過super 關鍵字先去初始化父類這一部分,把初始化父類操作的傳回值賦值給self
2)去判斷初始化父類時候的傳回值,如果傳回值不為空白說明父類初始化成功,去初始化當前類特有的成員變數
3)返回self
3.2【帶參構造方法】
實際上就是帶個參數~~ so easy ~~參照set方法的帶多參
3.3【對象的初始化順序】
1)先去通過super 關鍵字先去初始化父類這一部分,把初始化父類操作的傳回值賦值給self
2)去判斷初始化父類時候的傳回值,如果傳回值不為空白說明父類初始化成功,去初始化當前類特有的成員變數
======
(三)self的使用
1)
self:接受訊息的對象或類,當前對象的指標 (指向 方法調用者)。 注意: 在類方法中,self一定指向類
super:接受訊息的對象的父類,用於調用父類的成員方法。
出現的地方:所有的OC方法中(對象方法\類方法),不能出現在函數
2)作用
1> 使用 "self->成員變數名" 訪問當前方法調用的成員變數
2> 使用 "[self 方法名];" 來調用方法(對象方法\類方法)
程式碼範例:
/* self 1.使用場合:只能用在方法(對象方法\類方法),不能用在函數中 2.每次調用方法的時候,系統會自動建立self指標 3.self指標指向方法調用者 */#import <Foundation/Foundation.h>@interface Car : NSObject{ int _wheels;}- (void)setWheels:(int)wheels;- (int)wheels;- (void)run;@end@implementation Car// 所有的成員變數(不管是不是@public),都能直接在對象方法中訪問- (void) setWheels:(int)wheels{ self->_wheels = wheels;}- (int) wheels{ return self->_wheels;}- (void) run{ // self是一個特殊的指標,只在@implementation的方法中才有 // self其實是方法中一個內建指標,每次調用方法,都會有self這個指標 // self指標指向方法調用者 int _wheels = 10; // 利用self指標存取方法調用的成員變數_wheels NSLog(@"%i個輪子的車子飛奔起來了!", self->_wheels);}/* 錯誤寫法:self不能用在函數中void test(){ self->_wheels = 10;} */@endint main(){ Car *c = [Car new]; [c setWheels:4]; [c run]; return 0;}
(四)對象方法和類方法
>對象方法
1)以減號-開頭
2)只能讓對象調用,沒有對象,這個方法根本不可能被執行
3)對象方法能訪問執行個體變數(成員變數)
>類方法
1)以加號+開頭
2)只能用類名調用(通過類名直接調用),對象不能調用
3)類方法中不能訪問執行個體變數(成員變數)
4)使用場合:當不需要訪問成員變數的時候,盡量用類方法
注意: 類方法和對象方法可以同名;執行個體變數_xxx不能在類方法中訪問。
>【類方法的三個作用】
1:簡單快速的建立對象
2:如果一個功能是由多個方法協同完成的,用 類方法可以留出一個簡單易用的介面
3:實現單例模式
===============
小知識點補充:
(1)
nil:如果要把對象賦值為空白 用nil
Nil :如果要把基礎資料型別 (Elementary Data Type)賦值為空白 用Nil
void * :可以指向任何資料類型的變數
id類型: 可以引用任何類執行個體化的對象 ,在給所引用的對象發訊息時不需要強轉
【self和super關鍵字】
self:接受訊息的對象或類,當前對象的指標 (通過那個對象使用到self,self 就是誰)。
super:接受訊息的對象的父類,用於調用父類的成員方法。
(2)對象的記憶體表示
//父類的成員變數
//父類的成員方法
//自身的成員變數
//自身的成員方法
(3)綜合物件
用物件導向的思想把大象裝進冰箱
對象 成員變數 成員函數 類
大象 age/weight/height setter/getter Elephant
冰箱 Elephant * ele opendoor/storeelephant/closedor Haier
iOS開發之oc--類與對象(2)-set/get方法及構造方法