面向对象基础

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语言混淆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值