面向对象
一、面向对象的思想
C语言是面向过程,OC是面向对象,那么什么是面向对象呢?面向对象和面向过程的区别可以通过视频课程中形象的例子来体会。
1.以用电脑听歌为例子:
面向过程:
打开电脑
播放电脑中的歌曲
关闭电脑
面向对象:
电脑
开机
播放歌曲
关机
区别分析:
面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象,两种思想都能达到解决问题的目的,但是解决思路不一样
2.现实生活中面向对象的例子
想打电话\发短信à 找手机,不用分析电话要怎样才能拨通
去饭店吃饭 à 找服务员,不用分析怎么到厨房炒菜
汽车坏了 à 找汽车维修工,不用分析修车的步骤
万物皆对象
3.常用术语
面向过程 ProcedureOriented
面向对象 ObjectOriented,简称OO
面向对象编程 ObjectOriented Programming,简称OOP
二、类和对象的关系
1.如何创建对象
面向对象解决问题的时候必须有对象,那如何创建对象呢?
例如创建一个汽车对象:
需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)
属性:轮子数、时速
功能(行为):跑
然后再根据图纸上的描述生成汽车
所以现在知道OC的面相对象:
OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类,OC利用类来创建对象,对象是类的具体存在。因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象
2如何设计类
类的设计有三个方面:
事物名称(类名):车(Car)
属性:轮子数(wheels)、时速(speed)
行为(功能):跑(run)
注意:类名首字母大写,不能有下划线,多个单词使用驼峰标识。拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
三、类的声明和实现
还是以车为例:定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑
要描述OC中的类分2大步骤:类的声明、类的实现(定义)。跟函数类似,函数有分声明和定义
1.类的声明:
一般形式为:
@interface 类名
{
成员变量1;
成员变量2;
.......
}
-(方法类型)方法名;
@end
#import<Foundation/Foundation.h>
@interface Car :NSObject
{
@public
int wheels; // 多少个轮子
int speed; // 时速
}
- (void)run; // 跑的行为
@end
1> 成员变量
@interface的大括号{}中声明的变量:wheels、speed
@interface的大括号和函数的大括号是不一样的
默认会初始化为0
2> @public
@public可以让Car对象的wheels和speed属性被外界访问
3> NSObject
NSObject其实是一种基类,加上:NSObject的目的是让Car类具备创建对象的能力
4> -(void)的“-”代表是对象方法,对象可以调用,类不可以。
2.类的实现
一般形式:
@implementation 类名
- (方法的类型)方法名
{
方法的具体实现;
}
@end
@implementation Car
- (void) run
{
NSLog(@"%d个轮子,%d时速的车子跑起来了",wheels, speed);
}
@end
3.创建对象
int main()
{
// 创建车子对象
Car *c = [Car new];
c->wheels = 4;
c->speed = 200;
[c run];
return 0;
}
main函数的代码分析、内存分析(对象在内存中有成员)
[Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址。
Car *c = [Car new];
用一个指针变量c指向内存中的Car对象
设置车子对象的属性
跟用指向结构体的指针访问结构体属性一样,用->
c->wheels = 4;
c->speed = 200;
四、常见错误
1.只有类的声明,没有类的实现
2.漏了@end
3.@interface和@implementation嵌套
4.两个类的声明嵌套
5.成员变量没有写在括号里面
6.方法的声明写在了大括号里面
五、语法细节
1.成员变量不能在{}中进行初始化、不能被直接拿出去访问
2.方法不能当做函数一样调用
3.成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)
4.类的实现可用写在main函数的后面,主要在声明后面就行了