时间: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; }