面向对象基础
程序员文章站
2024-03-22 14:00:10
...
文章目录
1、面向对象基本概念
- 面向对象(Object Oriented, OO)是软件开发方法
- 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物
- Object Oriented Programming OOP — 面向对象编程
2、面向对象和面向过程的区别
- 面向对象是相对面向过程而言
- 面向对象和面向过程都是一种思想
- 面向过程
- 强调的是功能行为
- 关注的是解决问题需要哪些步骤
- 面向对象
- 将功能封装进对象,强调具备了功能的对象
- 关注的是解决问题需要哪些对象
3、面向对象的特点
- 面向对象是一种符合人们思考习惯的思想
- 可以将复杂的事情简单化
- 将程序员从执行者转换成指挥者
- 完成需求时
- 先要去找具备有所需功能的对象来用
- 如果该对象不存在,那么创建一个具有所需功能的对象
- 这样可以简化开发并提高复用性
4、 类的使用
类的使用主要分为以下几个步骤
- 声明类
- 声明类的同时声明属性和行为(方法)
- 实现类
- 实现类的同时实现行为(方法)
- 创建对象
- 使用对象调用属性和行为(方法)
4.1 声明类
OC中使用以下代码声明类
// NSObject 是为了让我们的Iphone类具备创建对象的能力
@interface Iphone : NSObject
// OC类声明中属性只能写在 @interface 和 @end 直接的大括号中,编写OC类属性时,建议将所有属性的名称前面都加上_
{
// 默认类型不能直接访问,使用@public表示类属性是公开的
@public
float _model; // 型号
int _cpu; // cpu
double _size; // 尺寸
int _color; // 颜色
}
// 行为
/*
行为没有参数,不需要写(),在OC中,括号有特殊用途,括号中主要放数据类型
- 表示对象方法 + 表示类方法
*/
// 没有返回值,没有参数
- (void)about; // - 表示对象方法 + 表示类方法
// 有返回值,没有参数
- (char *)loadMessage; // 读取短信息
// 有返回值,有参数
// 注意:每个参数的数据类型前面必须加上一个:,:也是方法名称的一部分
- (BOOL)call:(int)number; // 打电话
// 有返回值,有多个参数
- (BOOL)sendMessage:(int)number :(char*)message; // 发短信
@end
4.2 实现类
使用以下代码实现类,实现类的时候需要实现声明类中的行为,不需要实现类属性
@implementation Iphone
// 行为的实现
- (void)about {
NSLog(@"型号: %f, cpu: %i, size: %lf, color: %i", _model, _cpu, _size, _color);
};
- (char *)loadMessage {
return "今天吃的什么";
}
- (BOOL)call:(int)number {
NSLog(@"打电话给 %i", number);
return true;
}
- (BOOL)sendMessage:(int)number :(char *)message {
NSLog(@"number -->%i, message -->%s", number, message);
return true;
}
@end
4.3 创建对象
在OC中想要通过一个类创建对象,必须给类发送一个消息:[类名称/对象名称 方法名称];
只要通过一个类调用类的new方法,也就是给类发送一个叫做new的消息之后,系统内部就会做3件事:
- 为Iphone类创建出来的对象分配存储空间
- 初始化Iphone类创建对象中的属性
- 返回Iphone类创建对象对应的地址
- 通过一个Iphone类型的指针接收Iphone对象的地址
Iphone *iphone = [Iphone new];
4.4 使用对象调用属性和行为
OC中的类其实本质就是一个结构体,所以iphone这个指针其实就是指向了一个结构体,可以使用指针名称->属性名访问
NSLog(@"iphone->_cpu --> %i", iphone->_cpu); // iphone->_cpu --> 0
iphone->_cpu = 10;
NSLog(@"iphone->_cpu --> %i", iphone->_cpu); // iphone->_cpu --> 10
// 调用对象方法
[iphone about]; // 型号: 0.000000, cpu: 10, size: 0.000000, color: 0
char *msg = [iphone loadMessage];
NSLog(@"%s", msg);
int number = 123;
BOOL flag = [iphone call:number];
if (flag) {
NSLog(@"打电话成功");
}
[iphone sendMessage:123456 :"快来上班吧"];
4.5 类方法和对象方法的区别
- 对象方法以-开头,类方法以+开头
- 对象方法必须用对象调用,类方法必须用类调用
- 对象方法可以直接访问属性(成员变量),类方法不可以直接访问属性(成员变量)
- 类方法的优点,调用类方法的效率会比调用对象方法高
- 类方法和对象方法可以进行相互调用
- 对象方法中可以直接调用类方法
- 类方法中可以实例化对象,然后调用对象方法(实际开发中不建议这样使用)
- 类方法可以直接调用其它类方法
- 对象方法中可以直接调用对象方法
4.5.1 类方法的应用场景
如果方法中没有使用到属性(成员变量),那么能用类方法就用类方法。类方法的执行效率比对象方法高
类方法一般用于定义工具方法
- 字符串查找
- 文件操作
- 数据库操作
4.6 全局变量、局部变量、成员变量的区别
4.6.1 全局变量
- 写在函数和大括号外的变量,称为全局变量
- 全局变量的作用域从定义的那一行开始,直到文件末尾
- 全局变量可以先定义后初始化,也可以定时的同时初始化
- 全局变量存储在静态区,程序启动就会分配内存空间,直到程序结束才会释放
4.6.2 局部变量
- 写在函数或代码块中的变量,称为局部变量
- 局部变量的作用域从定义的那一行开始,直到遇到大括号或者return
- 局部变量可以先定义后初始化,也可以在定义的同时初始化
- 局部变量存储在栈中,存储在栈中的数据系统会自动进行释放
4.6.3 成员变量
- 写在类声明的大括号中的变量,称为成员变量
- 成员变量只能通过对象访问。成员变量离不开类,离开类之后就不是成员变量
- 成员变量不能在定义的同时进行初始化
- 成员变量存储在堆中,存储在堆中的数据,不会被自动释放,只能手动释放
4.7 函数和方法的区别
4.7.1 函数
- 函数属于整个文件,虽然函数属于整个文件,但是不能将函数写在类的声明中,如果将函数写在类的声明中会不识别
- 函数可以直接调用
- 不能把函数当做方法进行调用
4.7.2 方法
- 方法属于某一个类,不能离开类
- 方法只能通过对象或类调用
- 不能把方法当函数进行调用
- 方法可以没有声明只有实现
- 方法可以只有声明没有实现,编译不会报错,但是运行会报错
4.8 常见错误
1、只有类的声明,没有类的实现
2、漏写@end
3、@interface和@implementation嵌套
4、成员变量没有写在括号里面
5、方法的声明写在了大括号里面
6、成员变量不能在{}中进行初始化、不能被直接拿出去访问
7、方法不能当做函数一样调用,需要使用类调用或对象调用
8、OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
9、C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
10、C函数不能访问OC对象的成员
11、低级错误,方法有声明,但是实现的时候写成了函数
12、OC可以没有@interface同样可以定义一个类
13、成员变量和方法不能使用static等关键词修饰,不要和c语言混淆
上一篇: 169、多数元素(python)
下一篇: spark常见错误