OOP: Oriented Objective Programming 面向对象编程。
面向对象编程的基本思想是以对象作为中心分析问题,而之前的C语言是根据过程来分析问题。
OC语言作为面向对象语言的一种,基本只有苹果旗下产品的系统才使用。例如ios,os x。
OC语言是一门全动态语言,包含一个运行时系统。
1、面向对象的两大特征:类和对象。 类是具有相同特征和行为的一类事物的抽象。对象就是类的实例。
2、面向对象的三大特点:继承、封装、多态
3、面向对象的好处: 可重用性(例如将五子棋游戏改成围棋游戏只需要将规则对象改一下就可以了,而不用将整个代码重写)、可扩展性
4、定义一个类: 分为两部分的定义。 接口部分:@interface....@end 实现部分: @implementation...@end
5、修饰变量的符号
①@public 公共变量,任意类都可以访问,都可以被继承
②@protected 受保护的,默认的,本类和子类可以访问,可以被继承
③@private 私有变量 只有本类可以访问,也可以被继承,只是继承后也不能访问而已
④@package 这个符号一般不使用,用以支持64位系统
(注:使用@public的坏处:暴露了类内部的细节,并且违背了面向对象的封装特性)
6、方法 "-"号方法是实例方法,"+"号方法是类方法。
类方法中不能使用实例变量,类方法可以共享
类方法和实例变量不在一个内存区域
类中不能出现同名方法
7、一个简单的类的声明与实现
// 接口部分 @interface...@end
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
@protected // 修饰实例变量,默认,一般可以不写
NSString *_name; // 姓名
int _age;
NSString *_gender;
}
- (void)sayHi; // 减号是实例方法,加号是类方法
- (void)eat;
@end
// 实现部分
#import "Person.h"
@implementation Person
// 初始化方法
- (id)init
{
_name = @"Sam";
_gender = @"male";
_age = 20;
// 返回当前对象
returnself;
}
- (void)sayHi
{
NSLog(@"我叫:%@ 年龄:%d 性别:%@", _name, _age, _gender);
}
- (void)eat
{
NSLog(@"It's time for lunch!");
}
@end
8、自定义初始化方法
- (id)initWithName:(NSString *)name
withAge:(int)age
withGender:(NSString *)gender;
一个方法的名字是参数形容词加冒号 initWithName:withAge:withGender: 有几个冒号就传了几个参数
// 使用初始化方法创建对象
Person *p = [[Person alloc] initWithName:@"小明" withAge:@"20" withGender:@"male"];
9、设置器与取值器 setter和getter
// 给_name添加设置值的方法
- (void)setName:(NSString *)name;
// 给_name添加取值的方法
- (NSString *)getName;
10、继承
// 定义一个student类继承person,student具有person所有的特征和行为
#import "Person.h"
@interface Student : Person
{
int _number; // 学号
}
11、指定初始化
// 这是一个完整的初始化方法,分三步完成。一般将所有自定义初始化都要调用的那个初始化方法作为指定初始化方法
- (id)initWithNumber:(int)number withName:(NSString *)name withAge:(int)age withGender:(NSString *)gender
{
// 优先调用从父类继承过来的初始化方法
// 如果初始化成功,再初始化自身特有实例变量
if (self = [super initWithName:name withAge:age withGender:gender]) {
_number = number;
}
// 最后返回对象
return self;
}
12、便利构造器 这是一个类方法
+ (id)personWithName:(NSString *)name withAge:(int)age;
+(id)personWithName:(NSString *)name withAge:(int)age
{
Person *p = [[Person alloc] initWithName:name withAge:age];
return p;
}
13、复合 (实例变量由其他类型组成)
@interface Family : NSObject
{
// 声明三个实例变量
Father *_father;
Mother *_mother;
Child *_child;
}
- (id)initWithFather:(Father *)father
withMother:(Mother *)mother
withChild:(Child *)child;
// 声明旅游方法
- (void)travel;
// 主函数中
// 创建一个男人对象
Father *man = [[Father alloc] init];
[man setName:@"张三"];
// 创建一个女人对象
Mother *woman = [[Mother alloc] init];
[woman setName:@"小七"];
// 创建一个孩子对象
Child *child = [[Child alloc] init];
[child setName:@"小强"];
// 创建一个家庭
Family *family = [[Family alloc] initWithFather:man withMother:woman withChild:child];
[family travel];