——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
面向对象和面向过程思想
objective-c语言是面向对象,c语言是面向过程的。面向对象和面向过程是两种不同解决问题的思想。
以用挖掘机挖坑为例,面向过程就是上车——>启动挖掘机——>开到地点——>开挖——>挖完熄火,面向过程的思想关注的是解决问题需要哪些步骤。面向对象则是找一台能挖坑的挖掘机和会开挖掘机的人,然后把任务交给他们让他们去完成就好了,面向对象关注的是解决问题需要哪些对象。
现实生活中还有很多面向对象的例子,比如去饭店吃饭找服务员,不用管菜是怎么在厨房炒的;汽车坏了找汽修工,不用分析修车的步骤;等等。
类和对象
面向对象编程中有两个重要的概念:类和对象。对象就是根据类创建出来的。
类是抽象的不是具体的某一个事物,它描述了事物的属性和功能,我们根据类的描述便可以创造出一个具体的对象。就像现实生活中我们画图纸设计一辆车,图纸上包括车的属性:轮子数、时速、等等,以及车的功能(行为):启动、跑、倒车、熄火、等等,这个就相当于面向对象编程中的类。我们可以根据图纸的设计制造出具体的事物:汽车,这相当于面向对象编程中的对象。
由此可见:
1. 我们要创建对象必须先有类;
2. objective-c中用类来创建对象,对象是类的具体存在;
3. 面向对象解决问题应该是先考虑需要设计哪些类,再利用各种类来创建各种对象。
类的设计
那么如何设计类呢?类的设计只关心三样东西:事物名称(类名)、属性(成员变量或称实例变量)、行为(方法)。
比如设计一个人类:
事物名称(类名):人(person)
属性(成员变量):身高(height)、年龄(age)
行为(方法):跑(run)、跳(jump)
类名有几点要注意:1.类名的第一个字母必须是大写;2.类名当中不能带有下划线;3.类名如果是由多个英文单词组成,则要使用驼峰标识(每个单词的首字母大写)。
类的声明和实现
接下来讲一下如何在objective-c语言中设计一个类。oc(objective-c的简称)语言中的类分为两大部分,类的声明和实现。
示例1:
#import <Foundation/Foundation.h>//用#import关键词导入Foundation框架,我们会用到这个系统框架中的类库
@interface Car : NSObject/*@interface表示我们要声明一个类,后面跟类名,":"后面跟的是基类名,所有的类都继承它,它封装了一些东西供继承它的子类使用*/
{
int wheels;//声明成员变量即类的属性:车轮数(wheels)
int speed;//车速
}
- (void)run;//声明一个对象方法(行为),前面是“-”号则代表这是一个对象方法只能由具体的对象来调用
+ (void)test;//声明一个类方法,它可被类名直接调用,类方法不能直接访问成员变量
@end//@end意味着类的声明部分结束
@implementation Car/*@implementation表明这是类的实现部分,类的声明和实现可以分开写(不同的文件当中也可),但是声明必须在main函数前面*/
- (void)run
{
NSLog(@"车子跑");//类的实现里面通常写方法是如何实现的即这个行为是什么
}
+ (void)test
{
NSLog(@"做模拟实验");
}
@end//@end表明类的实现结束
示例1展示了一个完整的类是如何设计出来的,它包括两大部分:类的声明和实现。没有类的声明部分只有实现部分也可以设计一个类,为了规范和方便使用,通常我们都会完整的写出声明和实现。
OC中的对象
设计好了类就可以根据类来创建具体的对象了。
示例2:
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
@public
int wheels;
int speed;
}
- (void)run;
+ (void)test;
@end
@implementation Car
- (void)run
{
NSLog(@"%d个轮子的车跑起来了时速达%d公里每小时", wheels, speed);
}
+ (void)test
{
NSLog(@"做模拟实验");
}
@end
int main()
{
[Car test];//用类名直接调用类方法,不依赖于对象
Car *car;//声明一个指向Car类型的指针,oc语言中对象都是由指针变量来操作的
car = [Car new];//用系统自带的一个类方法创建具体的车对象,赋值给指针变量car
car->wheels = 4;//给成员变量wheels赋值为4即我们造的车有4个轮子
car->speed = 200;//给成员变量speed赋值为200即我们的汽车速度为200km/h
[car run];//用对象调用对象方法,车跑起来了
return 0;
}
示例2展示了如何用类来创建对象以及对对象的使用,运行结果是:
2015-07-18 21:25:42.302 a.out[1313:691942] 做模拟实验
2015-07-18 21:25:42.304 a.out[1313:691942] 4个轮子的车跑起来了时速达200公里每小时
成员变量
成员变量不能在声明时直接初始化,必须得有对象才能初始化,默认值是0。成员变量跟随对象,对象消亡它也消亡,它只能由对象来访问和调用。
方法
一、
oc语言中的方法与函数的区别:
1. oc方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。不能独立于类存在;
2. 函数不属于类,跟类没有联系,函数只归定义函数的文件所有;
3. 函数不能访问oc对象的成员变量,指向对象的指针可以作为函数的返回值也可以作为函数的参数。
二、
与函数类似oc方法可以有返回值也可以没有返回值可以有参数也可以没有参数。
示例3:
-(double)square:(double)number;//参数类型写在小括号里
示例3声明了一个带返回值和参数的方法,注意此时的方法名是:square:
“:”也是oc方法名的一部分。
示例4:
-(double)square:(double)number
{
return number * number;
}
示例4展示了示例3中声明的方法的实现。
示例5:
- (int)sumWithNumber:(int)number1 andNumber:(int)number2;
示例5声明了一个带有两个参数的方法,oc为了增强代码的可读性通常要在参数名前写些东西,说明这个参数是什么,这也是方法名的一部分,因而该方法的名称是:
sumWithNumber: andNumber:
示例6:
- (int)sumWithNumber:(int)number1 andNumber:(int)number2
{
return number1 + number2;
}
示例6展示了示例5声明方法的实现。
类方法也可以有返回值和形参。
三、
类方法和对象方法的对比:
1.类方法:
1> 以加号“+”开头;
2> 只能由类名调用,对象不能调用;
3> 类方法中不能直接访问成员变量(实例变量);
4> 可以在类方法中通过调用对象方法访问成员变量;
5> 当不需要访问成员变量的时候尽量用类方法。
2.对象方法:
1> 以减号“-”开头;
2> 只能由对象调用,没有对象,这个方法根本不可能被执行;
3> 对象方法能访问实例变量。