一、面向对象和面向过程思想
OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同思想
1、面向对象和面向过程的区别
1.以用电脑听歌为例子a.面向过程
打开电脑
播放电脑中的歌曲
关闭电脑
b.面向对象(不是相亲的“对象”)
电脑
·开机
·播放歌曲
·关机
2.区别分析
a.面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象
b.没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样
2、现实生活中面向对象的例子
想打电话\发短信 找手机,不用分析电话要怎样才能拨通去饭店吃饭 找服务员,不用分析怎么到厨房炒菜
汽车坏了 找汽车维修工,不用分析修车的步骤
境界:万物皆对象
3、常用术语
面向过程 Procedure Oriented面向对象 Object Oriented,简称OO
面向对象编程 Object Oriented Programming,简称OOP
二、类和对象的关系
面向对象中有2个非常重要的概念:类和对象
1、如何创建对象
1.面向对象解决问题的时候必须有对象,那如何创建对象呢?
2.现实生活的例子:如何创造汽车对象?
a.需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)
属性:轮子数、时速
功能(行为):跑
b.然后再根据图纸上的描述生成汽车
c.每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例
d.图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括
2、OC中的面相对象
1.OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类
2.OC利用类来创建对象,对象是类的具体存在
3.因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象
3、需要设计哪些类,如何设计类
1.类的设计,只关心3样东西:事物名称(类名):人(Person)
属性:身高(height)、年龄(age)
行为(功能):跑(run)、打架(fight)
定义OC的类和创建OC的对象2.一般名词都是类
坦克发射3颗炮弹轰掉了2架飞机:这里面坦克、炮弹、飞机,都是对象。
小明在公车上牵着一条叼着热狗的狗:这里的小明、公车、热狗、狗,都是对象。
四、类的设计实例
1、类的设计:
1> 类名
* 类名的第一个字母必须是大写
* 不能有下划线
* 多个英文单词,用驼峰标识
2> 属性
3> 行为(功能)
2、植物大战僵尸的僵尸
* 类名:Zoombie
* 属性:life、speed、gongjili
* 行为:walk、bite、die
3、雷电的飞机
* 类名:Plane
* 属性:life、gongjili、speed、bombCount
* 行为:fly、bomb、shoot、die
4、电脑
* 类名:Computer
* 属性:band、expireDate
* 行为:open、clos
行为归属的的疑惑:有时候一个行为不知道该赋给谁,比如说电脑的开关机,有人认为应该是人来执行电脑的开关机,但是实际上应该是电脑的行为。因为电脑的开关机,这个行为该怎么执行,该怎么做是电脑最清楚的。
5、定义OC的类和创建OC的对象
·OC中模拟现实生活中的情况,创建一辆车出来。首先要有一个车子类,然后再利用车子类创建车子对象
·要描述OC中的类稍微麻烦一点,分2大步骤:类的声明、类的实现(定义)。跟函数类似,函数有分声明和定义
1、类的声明
1.示例代码:
/*
类名:Car
属性:wheels、speed
行为:run
*/
// 完整的写一个类:类的声明和实现
// 1、类的声明
// 因为使用了NSObject,所以必须要包含次头文件
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
@public
int wheels; // 轮胎的个数
int speed; // 时速(xxkm/h)
}
// 只要是OC对象方法必须是以减号-开头
// OC方法任何数据类型必须用小括号()括住
- (void)run;
@end
2.成员变量
·@interface的大括号{}中声明的变量:wheels、speed
·@interface的大括号和函数的大括号是不一样的
·默认会初始化为0
3.@public
@public可以让Car对象的wheels和speed属性被外界访问
4.NSObject
加上:NSObject的目的是让Car类具备创建对象的能力
2、类的实现
示例:
// 2、类的实现
@implementation Car
- (void)run
{
NSLog(@"%d个轮子,%dkm/h的车子跑起来了!", wheels, speed);
}
@end
OC中类的实习必须要使用@implementation关键字
3、创建对象
int main()
{
// 利用类来创建对象
// 执行了Car这个类的new行为来创建新对象
Car *c = [Car new];
Car *c2 = [Car new];
c2->wheels = 5;
c2->speed = 300;
c->wheels = 4;
c->speed = 250;
NSLog(@"车子有%d个轮子,时速为:%dkm/h", c->wheels, c->speed);
[c run];
[c2 run];
return 0;
}
4、面向对象封装的好处
·更加接近人类的思考方式
·只需要关注对象,不需要关注步骤
5、对象与函数参数
·对象成员变量作为函数参数
·指向对象的指针作为函数参数
·修改指向指向对象的成员
·修改指针的指向
五、类的声明和实现
1、@interface和@implementation的分工
2、常见错误
·@interface和@implementation嵌套
·两个类的声明嵌套
·成员变量没有写在括号里面
·方法的声明写在了大括号里面
3、语法细节
·成员变量不能在{}中进行初始化、不能被直接拿出去访问·方法不能当做函数一样调用
·成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)
·类的实现可用写在main函数的后面,主要在声明后面就行了
4、OC方法与函数的区别
·C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
·C函数不能访问OC对象的成员
·低级错误:方法有声明,但是实现的时候写成了函数
5、OC方法注意
·方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
·编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告
6、@implementation
没有@interface,只有@implementation,也是能成功定义一个类的@implementation Car : NSObject
{
@public
int wheels; // 多少个轮子
int speed; // 时速
}
- (void) run
{
NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
}
@end
七、代码示例
1、计算器的几个功能的实现
/*
计算器类
1、返回PI
2、计算某个数的平方
3、计算两个整数的和
*/
#import <Foundation/Foundation.h>
@interface Caculator : NSObject
- (double)pi; // 返回PI的值
- (int)square:(int)num; // 计算一个整数的平方
- (int)sumOf:(int)num1 and:(int)num2; // 获取两个整数的和
@end
@implementation Caculator
// 返回PI的值
- (double)pi
{
return 3.1415926;
}
// 计算一个整数的平方
- (int)square:(int)num
{
return num * num;
}
- (int)sumOf:(int)num1 and:(int)num2
{
return (num1 + num2);
}
@end
int main (int argc, const char *argv[])
{
Caculator *c = [Caculator new];
double pi = [c pi];
NSLog(@"PI的值为%f.", pi);
int n = [c square: 12];
NSLog(@"%d的平方是%d", 12, n);
int num1 = 10;
int num2 = 19;
int sum = [c sumOf:num1 and:num2];
NSLog(@"%d与%d的和为%d", num1, num2, sum);
return 0;
}
2、类的合理性设计
typedef enum {
SexMan, SexWoman
} Sex;
typedef enum{
ColorGreen, ColorRed, ColorYellow
} Color;
typedef struct {
int year;
int month;
int day;
} Date;
#import <Foundation/Foundation.h>
@interface Dog : NSObject
{
@public
Color curColor;
int age;
double weight;
}
- (void)run;
- (void)eat;
@end
@implementation Dog
- (void)run
{
weight--;
NSLog(@"%p 狗在跑!体重减少一斤,现在体重是%f!", self, weight);
}
- (void)eat
{
weight++;
NSLog(@"%p 狗在吃!体重增加一斤,现在体重是%f!", self, weight);
}
@end
@interface Student : NSObject
{
@public
int age;
double weight;
Date birthday;
Color favColor;
Dog *dog;
}
- (void)run;
- (void)eat;
- (void)walkDog;
- (void)feedDog;
@end
@implementation Student
- (void)run
{
weight--;
NSLog(@"人跑步,体重减少一斤,所以现在体重是%f!", weight);
}
- (void)eat
{
weight++;
NSLog(@"人吃东西,体重增加一斤,所以现在体重是%f!", weight);
}
- (NSString*) description
{
return [NSString stringWithFormat:@"年龄是:%d,体重是:%f,生日是:%d年%d月%d日,最喜欢的颜色是:%d", age, weight, birthday.year, birthday.month, birthday.day, favColor];
}
- (void)walkDog
{
NSLog(@"人正在遛狗,%p", dog);
[dog run];
}
- (void)feedDog
{
NSLog(@"人正在喂狗,%p", dog);
[dog eat];
}
@end
int main(int argc, const char *argv[])
{
Student *s = [Student new];
s->weight = 5.0;
NSLog(@"%@", s);
s->age = 22;
Date date = {1992, 02, 05};
s->birthday = date;
s->favColor = ColorRed;
Dog *d = [Dog new];
[d eat];
[d run];
s->dog = d;
[s walkDog];
[s feedDog];
return 0;
}