一、 面向对象与面向过程的区别
Objective-C语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,那么他们有什么区别呢?如下:
面向过程:它关注所要解决问题需要涉及的具体步骤,像C语言就是一条一条执行语句来实现具体的功能。
面向对象:它关注解决问题需要哪些对象。个人认为它是一种更加抽象的编程方法,更贴近现实的生活,它关注的焦点是问题的本身而不是语言。
举一个具体的例子来说:要建造一栋大楼,
面向过程的方法:关注具体的建造过程
1.打地基
2.垒砖
3.加盖
面向对象:关注需要哪些对象,由于建造师可以造楼所以只要找到建造师就行啦
建造师(对象)
》打地基(方法)
》垒砖 (方法)
》加盖 (方法)
可以看出两种思想都能达到解决问题的目的,只是思考的方式不同,在举几个现实生活中的面向对象的其他例子:
1> 想打电话\发短信 --- 找手机这个对象,不用分析电话拨通及通话的具体过程,这些由运营商做好了,我们只管找到终端也就是手机这个对象用它的打电话方法就可解决问题。
2>去饭店吃饭--找服务员这个对象,不用分析这个菜怎么做的这个过程
3> 电脑坏了 -- 找电脑修理工这个对象,不用分析你这电脑是修硬件还是修软件以及怎么修,找到他就可把电脑帮你修好。
总之面向对象跟贴近我们生活中遇到的问题。
二 、对象是如何产生的?
上文提到面向对象关注的是对象,那么这个对象是怎么创建的呢?
回到现实生活中,如何制作电脑?
1. 需要一个设计图纸或需求文档,清楚而详细的描述了电脑应具备的属性和功能( 方法)
属性:屏幕、键盘、硬盘、主板 、主频
功能;运行程序
2. 根据这个图纸开始制作出电脑
> 制造出的n多台电脑都是具体的对象,但这些对象都自己的属性值 ,如cpu有的是i3、有的是i5 ,显示器有14寸有15寸
> 设计图是抽象的,电脑是具体的,设计图是对所有电脑的高度概括和描述
三、Objective-C中的面向对象
1. 这里引出一个非常重要的概念--类:拥有相同属性和行为的对象都可以抽象为一个类
1) OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类
2) OC利用类来创建对象,对象是类的具体存在
3) 面向对象解决问题时应该是先考虑需要设计哪些类,再利用类创建多少个对象
4)在对方法进行类的划分中,一般采取的做法是谁最清楚个方法那么就把这个方法划分给谁。
类名是标识符的一种,需要符合规范,通常类名的第一个字母大写,且不能有下划线,如果有多个单词则使用驼峰标识
2. 如何设计类
1) 类的设计,只关心3样东西:
》 事物名称(类名):汽车(Car)
》 属性:轮子(wheels)、 时速(speed)
》 行为(功能):跑(run)
2) 一般名词都是类
》 坦克发射3颗炮弹轰掉了2架飞机
类:坦克 炮弹 飞机
对象:一辆坦克 三颗炮弹 两架飞机共六个对象
》 小明在公车上牵着一条叼着热狗的狗
类:小明 公交车 热狗 狗
对象:小明一人 公交车一个 热狗一根 狗一条 共四个对象
3) 拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
三、OC中类的声明和实现
OC 中类的声明和实现的关键字是@interface和@implementation,他们的分工如下:
@interface就好像暴露在外面的时钟表面,我们能够看见的东西。
@implementation就好像隐藏在时钟内部的构造实现,我们看不见的东西。
1.类的声明,关键字interface,下面在OC中模拟现实创建一辆车出来。首先要有一个汽车类,然后再利用汽车类创建车子对象。
>定义一个Car类,
>属性 2个:轮子数、时速
>行为(方法)1个:跑
<span style="font-size:14px;">#import<Foundation/Foundation.h>
//完整的写一个类: 类的声明和实现
//1.类的声明 interface关键字
//声明对象的属性和行为
//: NSObject的作用是让Car这个类具备创建对象的能力
@interface Car : NSObject
{ //只能用来声明对象的属性即成员变量(实例变量)默认初始化为0
@public //让外部指针访问对象内部成员变量
int wheels;//轮胎个数
int speed ;//时速
}
/* 方法(行为)的声明 :方法名、参数、返回值 也要声明和实现*/
//和C函数区别只要是对像的方法前面加-号
//OC方法中任何数据类型都必须用小括号()括住 只有一个作用
- (void)run;
@end</span>
2. 类的实现
<span style="font-size:14px;">/* 类的实现( 方法的实现 ) */
@implementation Car
// 方法的实现(说清楚里面有什么代码)
- (void)run
{
NSLog(@"车跑起来了!!!");
}
@end</span>
3.类的调用-对象的创建在主函数首先创建了一个Car类型的对象(先调用alloc分配存储空间,后调用init方法初始化为0),并定义了一个Car类型的指针指向创建的这个对象,之后初始化对象成员变量wheels的值为4, 然后打印输出
<pre name="code" class="objc" style="font-size: 18px; font-weight: bold;"><pre name="code" class="objc">int main
{
/* 在OC中想执行一些行为,就写上一个中括号[行为的执行者 行为名称] */
//利用类创建对象
//执行Car这个类的new行为
Car *p = [Car new];//返回对象的地址
p->wheels = 4;
p->speed = 250;
//给P所指的对像发送run消息
[p run];
NSLog(@"车子有%d轮子,时速%d km/h",p->wheels,p->speed);
return 0;
}
<pre name="code" class="objc" style="font-size: 18px; font-weight: bold;"><pre name="code" class="objc">int main
{
/* 在OC中想执行一些行为,就写上一个中括号[行为的执行者 行为名称] */
//利用类创建对象
//执行Car这个类的new行为
Car *p = [Car new];//返回对象的地址
p->wheels = 4;
p->speed = 250;
//给P所指的对像发送run消息
[p run];
NSLog(@"车子有%d轮子,时速%d km/h",p->wheels,p->speed);
return 0;
}
2015-03-15 23:21:05.644 a.out[934:135885] 车跑起来了!!!
2015-03-15 23:21:05.644 a.out[934:135885] 车子有4轮子,时速250 km/h
四、新手常见错误总结
(1)@interface @end和@implementation @end不能嵌套包含
(2)只有类的声明没有类的实现
(3)漏写@end
(4)两个类的声明嵌套(可以把顺序打乱)
(5)成员变量没有写在{}里
(6)方法的声明写在了{}里面
(7)在声明时对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在
(8)方法无法像函数那样的调用
(9)成员变量和方法不能用static等关键字修饰,不要和c语言混淆
(10)类的实现可以写在mian函数后面,在使用之前只要有声明就可以