欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面向对象基础

程序员文章站 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语言混淆