時間:2017年04月28日星期五
說明:本文部份內容均來自慕課網。@慕課網:http://www.imooc.com
教學示例源碼:無
我的學習源碼:https://github.com/zccodere/s...ios
什麼是面向對象
OOP面向對象編程(Object Oriented Programming)git
OOA面向對象分析 OOD面向對象設計
OOP基本概念github
對象 抽象 – 類
示意圖編程
抽象化:由對象變爲類;對象化:由類變爲對象。框架
類和對象的基本概念函數
建立類、獲得對象。從類到對象的過程稱爲實例化
代碼演示:學習
成員變量的聲明和使用atom
屬性的聲明和使用spa
示意圖設計
代碼演示:
成員變量是給類內使用的,聲明在.m文件中
屬性變量時給類外使用的,聲明在.h文件中
完整代碼演示:
一、People類聲明
// // People.h // Class1 // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // // 類內使用成員變量、類外使用屬性 // 姓名、年齡、性別 #import <Foundation/Foundation.h> @interface People : NSObject /* { NSString *_peopleName; int _peopleAge; int _peopleSex; } */ // 爲了讓類外能夠訪問成員變量 // 屬性就是成員變量的外部接口 @property(nonatomic,strong)NSString *peopleName; //- (void)setName:(NSString *)name; //- (NSString *)getName; @end
二、People類實現
// // People.m // Class1 // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import "People.h" @implementation People { int _peopleAge; int _peopleSex; } - (instancetype) init{ self = [super init]; if(self){ // 類內調用成員變量而不是屬性,屬性是給類外使用的 _peopleName = @"張三"; } return self; } /* - (void)setName:(NSString *)name{ _peopleName = name; } - (NSString *)getName{ return _peopleName; } */ @end
三、main類
// // main.m // Class1 // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import <Foundation/Foundation.h> // 導入類的聲明 #import "People.h" int main(int argc, const char * argv[]) { @autoreleasepool { // 實例化對象,*表明指針,即在OC中,全部對象都是指針。 /* [類名 方法名] [對象名 方法名] alloc 爲對象分配內存空間 init 進行初始化操做 */ People *p1 = [[People alloc] init]; People *p2 = [[People alloc] init]; People *p3 = [People new];//不建議使用 NSLog(@"p1 : %p",p1); NSLog(@"p2 : %p",p2); NSLog(@"p3 : %p",p3); p1.peopleName = @"張三"; p2.peopleName = @"李四"; NSLog(@"people name : %@",p1.peopleName); NSLog(@"people name : %@",p2.peopleName); } return 0; }
示意圖:
聲明方法
一、- + 方法的類型 - 表明對象方法,用對象名來調用 + 表明類方法,用來來調用 加號方法和減號方法能夠互相調用,固然須要類名和實例化對象。 加號方法不能調用成員變量,能夠調用靜態成員變量。 二、(void) 返回值類型 三、參數 :(int)x 表明有參數,(int)表明參數類型,x表明參數名稱 四、方法名 去掉方法類型、去掉參數類型、去掉參數名稱,剩下的就是方法名
OC初始化方法,類型Java的構造方法
完整代碼演示:
一、People類聲明
// // People.h // MethodDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import <Foundation/Foundation.h> @interface People : NSObject /* 聲明方法 一、- + 方法的類型 - 表明對象方法,用對象名來調用 + 表明類方法,用來來調用 加號方法和減號方法能夠互相調用,固然須要類名和實例化對象。 加號方法不能調用成員變量,能夠調用靜態成員變量。 二、(void) 返回值類型 三、參數 :(int)x 表明有參數,(int)表明參數類型,x表明參數名稱 四、方法名 去掉方法類型、去掉參數類型、去掉參數名稱,剩下的就是方法名 */ - (void)report; /* + (void)report1; - (int)showWithA:(int)a; // showWithA: andB: - (int)showWithA:(int)a andB:(int)b; */ // 初始化方法 - (instancetype)init;//重寫init方法 // 自定義初始化方法 - (instancetype)initWithPeopleName:(NSString *) peopleName andPeopleAge:(int)peopleAge; @end
二、People類實現
// // People.m // MethodDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import "People.h" @implementation People { // 成員變量 NSString *_peopleName; int _peopleAge; } // 靜態成員變量 static NSString *_peopleName1; - (void)report{ // NSLog(@"-號:report"); // //[People report1]; // _peopleName = @"123"; NSLog(@"peopleName = %@",_peopleName); NSLog(@"peopleName = %d",_peopleAge); } + (void)report1{ NSLog(@"+號:report1"); [[People alloc] report]; _peopleName1 = @"張三"; } - (int)showWithA:(int)a{ return a; } - (int)showWithA:(int)a andB:(int)b{ return a+b; } // 重寫初始化方法 - (instancetype)init { self = [super init]; if (self) { _peopleName = @"Visitor"; _peopleAge = 30; } return self; } - (instancetype)initWithPeopleName:(NSString *) peopleName andPeopleAge:(int)peopleAge{ self = [super init]; if(self){ _peopleName = peopleName; _peopleAge = peopleAge; } return self; } @end
三、main類
// // main.m // MethodDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import <Foundation/Foundation.h> #import "People.h" int main(int argc, const char * argv[]) { @autoreleasepool { // [] 表明調用方法,調用方法使用 [] People *p1 = [[People alloc] init]; // [p1 report]; // [People report1]; // // int a1 = [p1 showWithA:10]; // NSLog(@"a1 = %d",a1); // // int a2 = [p1 showWithA:10 andB:20]; // NSLog(@"a2 = %d",a2); [p1 report]; People *p2 = [[People alloc] initWithPeopleName:@"張三" andPeopleAge:20]; People *p3 = [[People alloc] initWithPeopleName:@"李四" andPeopleAge:30]; [p2 report]; [p3 report]; } return 0; }
什麼是封裝
隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀取和修改的訪問級別。
封裝的好處
一、將事物進行更加抽象,使用起來更加方便 二、對訪問的控制,達到更好的效果
訪問控制修飾符
@public 類內類外可以使用,可繼承,指方法調用(->) @protected 類內使用,可繼承 @private 類內使用,不可繼承 @package 框架權限,框架內至關於受保護,框架外至關於私有
完整代碼演示:
一、MyClass類聲明
// // MyClass.h // PackDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import <Foundation/Foundation.h> @interface MyClass : NSObject { // 成員變量訪問修飾符的問題 // 默認爲受保護 // 公有:在類內類外均可以使用而且能夠被繼承 @public int _classInt; // 私有:在類內可使用,類外沒法調用而且不能夠被繼承 @private // 受保護:默認:在類內可使用,類外沒法調用而且能夠被繼承 @protected NSString *_classStr; // 框架權限:在框架內至關於受保護,在框架外至關於私有 @package } @property(nonatomic,strong)NSString *className; // 方法是沒有修飾符的,同C語言同樣 - (void)report; @end
二、MyClass類實現
// // MyClass.m // PackDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import "MyClass.h" @implementation MyClass - (void)report{ _classStr = @"234"; NSLog(@"ClassName : %@",_className); NSLog(@"ClassName : %d",_classInt); } @end
三、main類
// // main.m // PackDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import <Foundation/Foundation.h> #import "MyClass.h" int main(int argc, const char * argv[]) { @autoreleasepool { MyClass *mc = [[MyClass alloc] init]; mc.className = @"個人類"; [mc report]; // 使用指向來調用類中的公有成員變量 mc->_classInt = 1001; [mc report]; } return 0; }
什麼是繼承,子類繼承父類。
什麼是多繼承,不少父類繼承,OC中沒有多繼承。
父類中的方法沒有寫聲明則子類沒法繼承父類中對應的方法。
完整代碼演示:
一、MyClass類聲明
// // MyClass.h // ExtendDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import <Foundation/Foundation.h> // NSObject:基類 @interface MyClass : NSObject { // 訪問修飾符默認是受保護 @protected int _classInt; // 私有 @private NSString *_classString; } @property(nonatomic,strong)NSString *className; -(void)report; @end
二、MyClass類實現
// // MyClass.m // ExtendDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import "MyClass.h" @implementation MyClass - (void)report{ _classInt = 1001; _classString = @"MyClassStr"; NSLog(@"ClassName : %@",_className); NSLog(@"ClassInt : %d",_classInt); NSLog(@"ClassString : %@",_classString); } @end
三、MySubClass類聲明
// // MySubClass.h // ExtendDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // // 引用父類頭文件 #import "MyClass.h" // interface時候,冒號(:)表明繼承關係 @interface MySubClass : MyClass - (void)show; @end
四、MySubClass類實現
// // MySubClass.m // ExtendDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import "MySubClass.h" @implementation MySubClass - (void)show{ _classInt = 1002; // 父類中的私有變量咱們是沒法繼承使用的 //_classString = @"fdsf"; NSLog(@"show : %d",_classInt); // 若是父類中的方法沒有寫聲明則子類沒法繼承父類中對應的方法 [self report]; } @end
五、main類
// // main.m // ExtendDemo // // Created by zc on 2017/4/28. // Copyright © 2017年 com.zccoder. All rights reserved. // #import <Foundation/Foundation.h> #import "MyClass.h" #import "MySubClass.h" int main(int argc, const char * argv[]) { @autoreleasepool { // 父類 MyClass *mc = [[MyClass alloc] init]; mc.className = @"MyClass"; [mc report]; // 子類 MySubClass *msc = [[MySubClass alloc] init]; msc.className = @"MySubClass"; [msc report]; [msc show]; } return 0; }
多態的基本概念
同一個父類多個子類不一樣的形態叫多態。 方法重寫和方法重載是多態的必要手段。 OC中不支持方法重載。
完整代碼演示:
一、Printer類聲明
// // Printer.h // DuoTaiDemo // // Created by zc on 2017/5/10. // Copyright © 2017年 com.zccoder. All rights reserved. // #import <Cocoa/Cocoa.h> @interface Printer : NSObject - (void)print; @end
二、Printer類實現
// // Printer.m // DuoTaiDemo // // Created by zc on 2017/5/10. // Copyright © 2017年 com.zccoder. All rights reserved. // #import "Printer.h" @implementation Printer - (void)print{ NSLog(@"我是打印機"); } @end
三、ColorPrinter類聲明
// // ColorPrinter.h // DuoTaiDemo // // Created by zc on 2017/5/10. // Copyright © 2017年 com.zccoder. All rights reserved. // #import "Printer.h" @interface ColorPrinter : Printer @end
四、ColorPrinter類實現
// // ColorPrinter.m // DuoTaiDemo // // Created by zc on 2017/5/10. // Copyright © 2017年 com.zccoder. All rights reserved. // #import "ColorPrinter.h" @implementation ColorPrinter // 方法重寫 - (void)print{ NSLog(@"彩色打印機"); } @end
五、BlackPrinter類聲明
// // BlackPrinter.h // DuoTaiDemo // // Created by zc on 2017/5/10. // Copyright © 2017年 com.zccoder. All rights reserved. // #import "Printer.h" @interface BlackPrinter : Printer @end
六、ColorPrinter類實現
// // BlackPrinter.m // DuoTaiDemo // // Created by zc on 2017/5/10. // Copyright © 2017年 com.zccoder. All rights reserved. // #import "BlackPrinter.h" @implementation BlackPrinter // 方法重寫 - (void)print{ // 調用父類方法 [super print]; // 調用當前類方法 //[self print]; NSLog(@"黑白打印機"); } @end
七、main類
// // main.m // DuoTaiDemo // // Created by zc on 2017/5/10. // Copyright © 2017年 com.zccoder. All rights reserved. // #import <Foundation/Foundation.h> #import "ColorPrinter.h" #import "BlackPrinter.h" int main(int argc, const char * argv[]) { @autoreleasepool { ColorPrinter *cp = [[ColorPrinter alloc] init]; BlackPrinter *bp = [[BlackPrinter alloc] init]; [cp print]; [bp print]; Printer *printer = [[ColorPrinter alloc] init]; [printer print]; } return 0; }