黑马程序员——ObjC基础—类与对象

----------- Java 培训Android 培训IOS 培训.Net 培训、期待与您交流!------------ 
本节讨论OC中最重要的对象的概念及使用。

1、什么是类和对象
对象是面向对象语言新增的特性(c语言面向过程),怎么理解呢?我们知道现实世界中的事物都是以个体形式存在的(包括抽象的个体)。而计算机的主要工作也是帮助我们处理现实的问题,以往面向过程的语言所能够处理的事情复杂程度有限,面向对象语言的出现,使得我们在编程的时候,能够想处理日常事物一样方便和具体,他通过将函数方法,数据处理等内容抽象成一个个的对象,从而程序的设计变成了对象的操作。
对象有什么特点?
对象包括属性、方法还有接口,属性就是这个对象的特征,方法就是这个对象的功能作用,接口是对象与外部的关系。同一种对象可能有多个不同的个体,他们同属于一个对象类,这个类抽象出了对象的所有相同的部分。就像人一样,我们每个人都有名字和年龄等属性(属性),我们可以吃饭、睡觉(方法),我们可以与外界交流(接口),而我们人的个体也存在一个抽象的类,称作人类。

2、类和对象的创建
a、类的创建
OC中对象的创建类似结构体,我们首先要抽象出一个对象类,然后根据这个类创建对象实例,下面我们创建一个简单的Person类,来了解下对象的使用。
@interface Person : NSObject // 接口
{
   @public // 表示属性外部可见
    NSString *name; // 类的属性:名字
    NSInteger age; // 类的属性:年龄
}
- (void)eat;  // 类的方法:吃
- (void)sleep; // 类的方法:睡觉
- (void)talk; // 类的方法:说话
@end
上述代码,我们定义了一个对象类的雏形,这个类有哪些属性,他能做哪些工作,都写在里面,这种以@interface包起来的代码块,我们称之为接口。
观察发现在第一行代码的右边有个NSObject,这是一个特殊的类,我们创建的大部分类都要继承自这个类。类的创建还有一个分类的概念,分类是用来扩展主类弓能的,可以实现类编写工作的分工和庞大类的组织,分类和主类的创建方式类似,只是在名称后面加“+分类名”,不同点是分类只能创建方法,不能增加属性。
注:在面向对象编程语言中,继承是一个重要的概念,就像自然界的万物一样,某一类事物往往和别的类型的事物具有某些相似的地方,就比如猫和狗,他们都是哺乳动物,也就是说,猫和狗都有哺乳动物的特性。同样的,在编程设计中我们也采用这样的结构,在创建猫和狗之前,我们先创建出哺乳动物这个类,然后猫和狗都继承自这个类,这样,在哺乳动物类中存在的属性和方法,猫和狗也同样继承,也就是说,我们不需要再写一遍。这样可以大大简化程序的设计工作。
稍微思考一下,就会发现,上述的代码并没有进行实际的操作指令,只能算是一种声明(这类似函数的提前声明),我们还要设计一个代码块来实现上面的声明:
@implementation Person // 类的具体实现

- (void)eat{
    NSLog(@"Eating!");
}

- (void)sleep{
    NSLog(@"Sleeping!");
}

- (void)talk{
    NSLog(@"I am %@, %ld years old!", name, age);
}

@end
在该代码块中,我们实现了吃、睡觉、说话等Person对象类的方法,注意,在方法中可以调用对象的属性。
以上两个代码块合在一起,就是一个完整类的创建。
疑问:类的细节我们完全可以在实现一段代码里实现,为什么要弄出接口和实现两个代码块呢(事实上经常是放在两个文件里)?
大家需要注意的是,接口虽然没有实现具体的功能,但是他列举出了对象类必须要实现的功能,而且能够与外界进行交互的属性也都定义在这里,这实际上就是一种规范,大家约定俗成的把类的规范单独放在一个文件里,而把实现放在另一个文件里,这样的好处是方便了代码的复用,我们编好了一个类,别的人可也可以拿来用,别的人不需要知道这个类是怎么实现的,只要按照接口文件的要求使用即可。值得一提的是Foundation框架中,我们可以查看其内部的所用可用对象
方法和属性,但是具体的实现已经被封装起来,我们无法查看,这从某种意义上是一种保护措施,保护了Foundation框架的知识产权,同时,也保证了该框架的独立、完整和标准。
b、对象的创建
类创建好了之后,我们还需要创建类的实例,也就是具体的对象!他的创建方法比较简单,我们只要使用类自带的 new 方法即可创建一个类的实例(对象),Person类里我们并没有创建new方法,这个方法是在NSObject类里创建的,Person类继承了这个方法。那么这个方法怎么去调用呢?也很简单,如下所示:
[对象A  方法B],这样就调用了 对象A 里面的 方法B,这个方括号是标准写法,方法也可以有返回值,整个方括号执行完之后就会返回一个属性。
我们来看看Person对象是怎么创建的:
int main() // 入口函数
{
    
    Person *p1=[Person new]; // 创建 Person类 的实例 P1
    
    p1->name = @"xiaoming"; // 为实例 p1 的 name属性 赋值
    p1->age = 12; // 为实例 p1 的 age属性赋值
    
    [p1 talk]; // 调用 p1 的方法 talk
    
    return 0;
}
在OC面向对象编程中,我们以后接触的大部分都是类似 [对象 方法] 这样的语句,这实际上就是前面提到过的消息,这里我们调用了 Person类 的 new 方法,该方法能够在内存中为对象 p1 开辟空间,同时负责其属性的初始化工作。
代码中 -> 用来指向对象的属性,并为其赋值。
执行结果:
2015-02-08 17:13:42.010 Study[13155:303] I am xiaoming, 12 years old!

3、对象的实质
对象的本质是一种结构体,我们所创建的对象,和结构体一样,是放在计算机的堆中的(二级缓存),内部存放的是对象所有属性(有的是指针)以及一个指向方法地址的指针(isa,不可读),每一个对象都占有一块独立的堆空间,这样一个个新建的对象分别占有不同的堆空间。而对象的方法因为都是相同的,则单独开辟一块只读区域来存放。
类本身也是一种对象,这个对象比较特殊,他更像是一个工厂对象,在程序的周期内他不会创建自己,他负责创建其他对象。


----------- Java 培训Android 培训IOS 培训.Net 培训、期待与您交流!------------ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值