一、面向对象和面向过程
OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同思想
1. 面向对象
面向对象思想简单的说就在在解决问题的时候去找具备解决问题能力的人或物去解决问题,例如刷碗,用面向对象思想就是可以雇个人刷或者用洗碗机刷,其关注点在与谁能解决问题。
2. 面向过程
面向过程就是在解决问题的时候找具体的解决方法去解决问题,如刷碗,用面向过程思想就是要了解刷碗的整个过程,其关注点在于如何刷。
二、类和对象
面向对象中有2个非常重要的概念:类和对象
例如要早一架飞机
Ø 1.类就像是设计建造图纸,图纸中定义了飞机应该具有哪些属性和功能。
Ø 2.对象就是根据图纸所造出来的飞机,具有图纸所定义的属性和功能。
1. 设计类:
类的设计,只关心3样东西:
事物名称(类名):飞机(Airplane)
属性:座位数(seats)、重量(weight)
行为(功能):飞(run)
1> 类名
* 类名的第一个字母必须是大写
* 不能有下划线
* 多个英文单词,用驼峰标识
2> 属性
3> 行为(功能)
代码示例:
<span style="font-size:14px;">#import<Foundation/Foundation.h>
// 类的声明
@interfaceAirplane : NSObject
{
// @public可以让外部的指针间接访问对象内部的成员变量
@public
//定义属性
int seats;
int weight;
}
// 方法的声明
-(void)fly;
@end
// 方法的实现
@implementationAirplane
-(void)fly
{
NSLog(@"有%d个座位,重量为%dKG的飞起来了!",seats,weight);
}
@end
intmain()
{
//创建对象
Airplane *plane = [Airplane new];
// 给对象属性赋值
plane ->seat = 100;
plane ->weight = 2000;
// 调用对象方法
[plane fly];
return 0 ;
}</span>
方法
1.对象方法都是以减号 -
2.对象方法的声明必须写在@interface和@end之间
对象方法的实现必须写在@implementation和@end之间
3.对象方法只能由对象来调用
4.对象方法归类\对象所有
5.注意方法名包括冒号
常见错误
l 只有类的声明,没有类的实现
l 漏了@end
l @interface和@implementation嵌套
l 两个类的声明嵌套
l 成员变量没有写在括号里面
l 方法的声明写在了大括号里面
语法细节
l 成员变量不能在{}中进行初始化、不能被直接拿出去访问
l 方法不能当做函数一样调用
l 成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)
l 类的实现可用写在main函数的后面,主要在声明后面就行了
OC方法和函数的区别
l OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
l C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
l C函数不能访问OC对象的成员
l 低级错误:方法有声明,但是实现的时候写成了函数
OC的方法注意
l 方法只有声明,没有实现(经典错误)
l 方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告
函数
1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
2.函数调用不依赖于对象
3.函数内部不能直接通过成员变量名访问某个对象的成员变量
带参数的方法:
u 设计一个计算和的方法
// 方法声明
- (double)sumOfNum1:(double)num1andNum2:(double)num2;
//方法实现
- (double)sumOfNum1:(double)num1andNum2:(double)num2
{
return num1 + num2;
}
方法调用
三、封装
1.set方法和get方法的使用场合
@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检、水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数
2. set方法
1.作用: 提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤
2.命名规范:
> 方法名必须以set开头
> set后面跟上成员变量的名称,成员变量的首字母必须大写
> 返回值一定是void
> 一定要接收一个参数,而且参数类型跟成员变量类型一致
> 形参的名称不能跟成员变量名一样
3. get方法
1) 作用:返回对象内部的成员变量
2) 命名规范:get方法的名称一般就跟成员变量同名
4. 成员变量的命名规范
成员变量都以下划线 _ 开头
可以跟get方法的名称区分开
可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量
5. 代码示例
<span style="font-size:14px;">#import <Foundation/Foundation.h>
// 声明
@interface Car: NSObject
{
int _wheels; //轮子个数
}
/*set方法*/
- (void)setWheels:(int)wheels;
/*get方法*/
- (int)wheels;
@end
@implementation Car
//set方法的实现
- (void)setWheels:(int)wheels
{
// 对外面传进来的轮子数进行过滤
if (wheels<=0)
{
wheels = 1;
}
_wheels = wheels;
}
//get方法的实现
- (int)wheels
{
return _wheels;
}
@end</span>
6. 封装的好处
过滤不合理的值
屏蔽内部的赋值过程
让外界不必关注内部的细节
过滤不合理的值
屏蔽内部的赋值过程
让外界不必关注内部的细节
四、类方法
1. 基本概念
直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)
2. 类方法和对象方法对比
1) 对象方法
以减号-开头
只能让对象调用,没有对象,这个方法根本不可能被执行
对象方法能访问实例变量(成员变量)
2) 类方法
以加号+开头
只能用类名调用,对象不能调用
类方法中不能访问实例变量(成员变量)
使用场合:当不需要访问成员变量的时候,尽量用类方法
3) 类方法和对象方法可以同名
例子:
/*
设计一个计算器类
* 求和
* 求平均值
*/
#import <Foundation/Foundation.h>
// 工具类:基本没有任何成员变量,里面的方法基本都是类方法
@interface JiSusnQi : NSObject
+ (int)sumOfNum1:(int)num1andNum2:(int)num2;
+ (int)averageOfNum1:(int)num1andNum2:(int)num2;
@end
@implementation JiSusnQi
+ (int)sumOfNum1:(int)num1andNum2:(int)num2
{
return num1 + num2;
}
+ (int)averageOfNum1:(int)num1andNum2:(int)num2
{
int sum = [JiSusnQi sumOfNum1:num1andNum2:num2];
return sum / 2;
}
@end
int main()
{
int a = [JiSusnQi averageOfNum1:10 andNum2:12];
NSLog(@"a=%d", a);
// JiSusnQi *jsq = [JiSusnQi new];
//
//
// [jsq sumOfNum1:10 andNum2:13];
return 0;
}