课堂笔记 04:面向对象入门
iOS 开发2463 字
面向对象思想
面向对象基本概念
- 软件编程就是将我们的思维转变成计算机能够识别语言的一个过程
- 面向对象(Object Oriented,OO)是软件开发方法
- 面向对象是相向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
- Object Oriented Programming-OOP ——面向对象编程
面向对象和面向过程区别
- 面向对象是相对面向过程而言
- 面向对象和面向过程都是一种思想
面向过程
- 强调的是功能行为
- 关注的是解决问题需要哪些步骤
面向对象
- 将功能封装进对象,强调具备了功能的对象
- 关注的是解决问题需要哪些对象
- 示例
把衣服放进洗衣机
面向过程
- 打开洗衣机
- 放进去衣服
- 关闭洗衣机
面向对象
- 洗衣机-打开
- 洗衣机-存储
- 洗衣机-关闭
现实生活中我们是如何应用面相对象思想的
- 想打电话\发短信
- 去饭店吃饭
- 汽车坏了
- 买电脑
- 包工头
- 女朋友
- 面试
面向对象的特点
- 是一种符合人们思考习惯的思想
- 可以将复杂的事情简单化
- 将程序员从执行者转换成了指挥者
完成需求时:
- 先要去找具有所需的功能的对象来用。
- 如果该对象不存在,那么创建一个具有所需功能的对象。
- 这样简化开发并提高复用。
类与对象
类与对象的关系
面向对象的核心就是对象,那怎么创建对象?
- OC中创建对象比较复杂, 首先要理解一个概念叫做类.
- 现实生活中是根据一份描述,一份模板创建对象,编程语言也一样,也必须先有一份描述,在这个描述中说清楚将来创建出来的对象有哪些属性和行为
OC中述事物通过类的形式体现,类是多个同种类型事物的抽象,概念上的定义。
- OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类
- OC利用类来创建对象,对象是类的具体存在, 因此面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象
类的设计
如何设计一个类
生活中描述事物无非就是描述事物的
名称
/属性
和行为
。如:人有身高,体重等属性,有说话,打架等行为。
事物名称(类名):人(Person) 属性:身高(height)、年龄(age) 行为(功能):跑(run)、打架(fight)
OC中用类来描述事物也是如此
- 属性:对应类中的成员变量。
- 行为:对应类中的成员方法。
- 定义类其实在定义类中的成员(成员变量和成员方法)
如何分析一个类
一般名词都是类(名词提炼法)
飞机发射两颗炮弹摧毁了8辆装甲车
飞机 炮弹 装甲车
隔壁老王在公车上牵着一条叼着热狗的草泥马
老王 热狗 草泥马
- 拥有相同(或者类似)
属性
(状态特征)和行为
(能干什么事)的对象都可以抽像成为一个类
第一个OC类
如何声明一个类
格式
注意:
- 1.必须以@interface开头,@end结尾
- 2.成员变量的声明,必须写在@interface与@end之间的大括号中
- 3.方法的声明必须在{}下面,不能写在{}中
如何实现一个类
格式
@implementation MyClass
- (id)initWithString:(NSString *)aName
{
//写代码处
}
+ (MyClass *)myClassWithString:(NSString *)aName
{
//写代码处
}
@end
注意:
- 必须以@implementation开头,@end结尾
- 类名必须和声明的一致
如何创建一个对象
用类的方式告诉计算机,我们需要一个什么样的对象,之后我们要在程序中使用这个对象,就必须先创建一个对象
注意[Car new];做了三件事
- 1.在堆内存中开辟了一块新的存储空间
- 2.初始化成员变量(写在类声明大括号中的属性就叫成员变量,也叫实例变量)
- 3.返回指针地址
消息机制
- 使用对象调用方法就是OC中的消息机制
- OC中调用方法的格式:[类名或者对象名 方法名];
对象的注意点
- 可以通过 对象->对象成员(注意声明属性为:@public) 的方式访问对象中的成员,
- 每一个对象中都有一份属于自己的属性。
- 对其中一个对象的成员进行了修改。和另一个对象没有关系
对象方法的声明和实现
对象方法声明
格式
特征
- 对象方法以-开头如 -(void)xx;
- 对象方法只能由对象来调用
- 对象方法中可以访问当前对象的成员变量
- 调用格式 [对象名 对象方法名];
示例
//声明没有返回值的对象方法
- (void)method;
//声明有返回值的对象方法
- (int)method;
//声明有返回值有参数的对象方法
- (int)method: (int)var;
//声明有返回值有多个参数的对象方法
- (int)method: (int)var1 andVar2: (int)var2;
对象方法实现
- 必须写在以@implementation开头,@end之间
- 在声明的后面加上{}即表示实现
- 将需要实现的代码写在{}中
类方法的声明和实现
类方法声明
格式
- 将对象方法-号变为+号
特征
- 类方法以+开头 如+(void)put;
- 类方法只能由类来调用
- 类方法中不能访问实例(成员)变量,因为类方法由类来调用,并没有创建存储空间 来存储类中的成员变量。
类方法的好处:
- 不依赖于对象,执行效率更高;
- 能用类方法解决的问题,尽量使用类方法;
类方法的场合:
- 当方法内部不需要使用到成员变量时,可以改为类方法
- 类方法一般用于编写工具方法
示例
//声明没有返回值的方法
+ (void)method;
//声明有返回值的方法
+ (int)method;
//声明有返回值有参数的方法
+ (int)method: (int)var;
//声明有返回值有多个参数的方法
+ (int)method: (int)var1 andVar2: (int)var2;
类方法实现
+ 必须卸载以@implementation开头,@end之间
+ 在声明的后面加上{}即表示实现
+ 讲需要实现的代码写在{}中
对象方法和类方法区别
对象方法
- 对象方法是属于对象的
- 以减号-开头
- 只能让对象调用,没有对象,这个方法根本不可能被执行
- 对象方法能访问实例变量(成员变量)
- 对象方法中可以调用当前对象的对象方法
- 对象方法中可以调用其他对象的对象方法
- 对象方法中部可以调用类方法
类方法
- 类方法是属于类的
- 以加号+开头
- 只能用类名调用,对象不能调用
- 类方法中不能直接访问实例变量(成员变量)
- 类方法中不能直接调用对象方法,要想调用对象方法,该对象必须通过参数传入。
使用场合:
- 当不需要访问成员变量的时候,尽量用类方法
类方法和对象方法可以同名
对象的存储细节
对象的存储细节
类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据一份存储空间,类的方法存储于此。
isa指针
- 每一个对象都包含一个isa指针,这个指针指向当前对象所属的类。
- [p eat];表示给p所指向的对象发送一条eat消息,调用对象的eat方法,此时对象会顺着内部的isa指针找到存 储于类中的方法,执行。
- isa是对象中的隐藏指针,指向创建这个对象的类。
- 通过isa指针我们可以在运行的时候知道当前对象是属于那个Class(类)的
使用一个类创建多个对象
Car *car1 = [Car new];
Car *car2 = [Car new]
函数与方法对比
对象方法:
- (1)对象方法的实现只能写在@implementation...@end中,对象方法的声明只能写在 @interface...@end中间
- (2)对象方法都以-号开头,类方法都以+号开头
- (3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用
- (4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end中,但写在 @interface...@end会无法识别,函数的声明可以在main函数内部也可以在main函数外部。
- (5)对象方法归类\对象所有
函数:
- 所有的函数都是平行的
- 函数不存在隶属关系
- 使用的时候可以直接调用
- 不可以访问对象中的成员变量
常见错误
- @interface @end和@implementation @end不能嵌套包含
- OC是弱语法,可以只有@implementation,但实际开发中千万不要这样。
- 只有类的声明没有类的实现 ,只有@interface没有@implementation时,程序编译能够通过
- 漏写@end
- 两个类的对象声明顺序(可以把顺序打乱)
- 成员变量没有写在{}里
- 方法的声明写在了{}里面
- 在声明时不能对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在
- 方法无法像函数那样的调用
- 成员变量和方法不能用static等关键字修饰,不要和c语言混淆
- 类的实现可以写在mian函数后面,在使用之前只要有声明就可以