Objective-C学习笔记二:面向对象概述

[url=http://sarin.iteye.com/blog/1754920]接上文[/url]
从字面来理解Objective-C就是对象化的C,那么也就是说O-C是对C的扩展,加入了对象的概念。当然C++也是有对象概念的,只是两者的编译环境有所不同。
面向对象的概念不是针对某一种编程语言而言的,它是一种程序设计思想。最基本的面向对象包括了类,对象和方法这三个概念。举日常生活中的例子,比如10路公交车,10路有几十辆车,每一辆车都是一个对象,10路并不是拥有任意一辆车,而是分配给它的特定的车。每一辆车都会有一个编号,这在公交系统中是唯一的。
那么在面向对象术语中,10路的任意一辆车都是公交车的一个实例。定义Vehicle为汽车类的类名,那么一辆车就是从该类创建的。每制造一辆车,都会创建汽车类的一个新的实例,而汽车的每个实例都称为一个对象。
不同车辆的型号不同,那么会有不同的属性,比如载客量,功率等。而使用车辆执行特定的操作,比如:加油,起步,到站,(可能还会有)检修,清洗等。这些操作可以对任意一辆车进行操作。这些对实例的操作称为方法。
如果想知道该车一共生产了多少辆,那么这个方法是适用在类上的,所以叫类方法。而想知道每辆车的行驶总里程或者当前油量,那么不同的车会有不同的数值,这个方法就是实例方法。
下面来应用具体的语法来看看Objective-C中的类,分数是一个数学概念,包含两个部分(分子和分母),我们知道了如何定义变量,那么使用变量,我们可以这么来表示一个分数:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

@autoreleasepool {
int numerator=1;
int denominator=3;

NSLog(@"The fraction is %i/%i",numerator,denominator);

}
return 0;
}

这里只是用于显示,并没有考虑分母为0的情况,当然这么写就是分母为0也不会有问题,因为代码中并没有真实的分数计算。我们运行代码,就会得到输出:
[img]http://dl.iteye.com/upload/attachment/0078/5850/a5de2c00-1651-3ea8-8181-064877fb04d1.png[/img]
下面我们编写一个Fraction类来表示分数,在项目Prog1上点击右键,选择New File,然后看到如下图所示窗口:
[img]http://dl.iteye.com/upload/attachment/0078/5852/913af508-fa19-3b32-a001-9e0354e5fbd5.png[/img]
选择Objective-C class类型,点击Next继续:
[img]http://dl.iteye.com/upload/attachment/0078/5854/a05f6783-d6bf-3de3-a5cf-04702f4eee4c.png[/img]
给我们的分数类起个名字Fraction,类型已经为我们选好了,就是NSObject类型,点击Next继续:
[img]http://dl.iteye.com/upload/attachment/0078/5856/38456461-95ed-345a-906c-0434c614bcda.png[/img]
选择一个位置,我们将这个类保存在Prog1下,直接点击Create创建即可,得到如下图所示的两个文件:
[img]http://dl.iteye.com/upload/attachment/0078/5858/f02006c0-c327-3f2b-8c0b-ae569a127ace.png[/img]
Fraction.h是头文件,Fraction.m是Objective-C的类文件,在头文件中,我们需要编写@interface部分,代码如下:

//
// Fraction.h
// Prog1
//
// Created by Nan Lei on 12-12-25.
// Copyright (c) 2012年 Nan Lei. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Fraction : NSObject

-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;

@end

可以先不管这些代码的具体含义,之后在Fraction.m文件中编写类的实现和主函数,代码如下:

//
// Fraction.m
// Prog1
//
// Created by Nan Lei on 12-12-25.
// Copyright (c) 2012年 Nan Lei. All rights reserved.
//
#import "Fraction.h"

@implementation Fraction
{
int numerator;
int denominator;
}

-(void) print
{
NSLog(@"%i/%i",numerator,denominator);
}

-(void) setNumerator:(int)n
{
numerator=n;
}

-(void) setDenominator:(int)d
{
denominator=d;
}

@end


int main(int argc, const char * argv[])
{
@autoreleasepool {
Fraction *myFraction;

myFraction=[Fraction alloc];
myFraction=[myFraction init];

[myFraction setNumerator:1];
[myFraction setDenominator:3];

NSLog(@"The value of myFraction is: ");
[myFraction print];
}
return 0;
}

代码已经写完,下面先运行出效果看看。这里注意我们在一个项目中不能有两个主函数的定义存在,那么要把之前main.m文件删除,确保运行没有问题,我们点击Run,就会得到如下输出:
[img]http://dl.iteye.com/upload/attachment/0078/5860/7e7c8820-80f9-3c8c-b8bb-a907102b313f.png[/img]
代码运行没有问题,我们来看看这两个文件中的代码都是什么意思。
先看头文件,这中间[b]#import <Foundation/Foundation.h>[/b]很好理解,就是导入系统类。之后的[b]@interface Fraction : NSObject ... @end[/b]是类的定义部分。以@interface开始,后面跟着类名,冒号后面是父类的名称,说明我们的类是继承自NSObject的,关于继承的概念这里先不说。那么中间的代码就是类中方法/类属性定义了。
关于类名的命名规则,方法名的命名规范,这里就不再多说,我们按照习惯和约定来编写即可。首先对于一个方法,开始为负号(-),这是告诉Objective-C的编译器,该方法是一个实例方法,如果是正号(+),那么该方法就是类方法,注意和UML中的+/-区分,这里的+/-不表示访问控制。
紧跟正负号后面的是方法返回值,这里我们定义的三个方法都是(void),无返回值类型的。那么这里可以使用(int)作为整型返回值,(double)作为双精度浮点型返回值。返回值定义后面的就是方法名,如果该方法没有参数,直接分号结束即可,比如-(void) print;
如果方法接受参数,那么在方法名后面加上冒号,冒号之后是参数定义,也是(参数类型) 参数名称的格式,比如(int) m。那么我们在头文件中编写的所有代码的含义就都明白了。
下面来看.m文件,首先是[b]#import "Fraction.h"[/b],表示导入我们定义的头文件,而头文件中已经导入了Foundation.h,那么这里也会自动导入Foundation.h。
[b]@implementation Fraction ... @end[/b]是实现部分。格式就是@implementation后跟着类名,以@end结束。
在@interface部分我们没有定义属性,因为本例中的变量都是成员变量而不是类属性,一组大括号中放置的是实例变量定义,比如本例的

{
int numerator;
int denominator;
}

之后是对方法的实现,方法声明后的一对儿大括号内就是具体的方法实现代码,本例中对print方法的实现就是调用系统的NSLog函数,而setNumerator和setDenominator方法就是赋值操作。
最后是主函数部分,就是我们的具体业务代码实现,[b]Fraction *myFraction[/b];表示声明一个引用(指针)变量myFraction,其类型是Fraction。有了引用,要创建一个分数,可以使用[b]myFraction=[Fraction alloc];[/b]来完成,alloc是allocate的简写,表示为新的对象分配内存空间,这个写法就是告诉Fraction类要执行alloc方法,现在这个方法我们没有定义,那就是系统类库提供的。
使用alloc分配空间后,紧接着是[b][myFraction init];[/b]这要对我们的myFraction变量进行初始化。同理,init也是系统提供的初始化方法。和alloc方法一起,可以看做Java中的new Fraction()来生成一个Fraction对象,其实这里使用new方法来合并alloc方法和init方法也是可以的,写为[b]Fraction *myFraction = [Fraction new][/b]。
以上两个语句可以合并为
Fraction *myFraction=[[Fraction alloc] init];
来写,这是O-C编程中比较常见的语句。
之后的[b][myFraction setNumerator:1];[/b]是告诉myFraction调用setNumerator方法,并且提供了一个变量1作为参数。同理[b][myFraction setDenominator:3];[/b]就好理解了。之后的NSLog代码不再解释,最后的[myFraction print];就是调用myFraction的print方法来打印Log了。
这里没有release操作,因为我们使用的XCode版本高于4.2,系统会默认开启ARC机制,自动释放内存。
下面来看使用多个分数的示例(主函数部分如下,其余内容和之前相同):

int main(int argc, const char * argv[])
{
@autoreleasepool {
Fraction *frac1=[[Fraction alloc] init];
Fraction *frac2=[[Fraction alloc] init];

[frac1 setNumerator:1];
[frac1 setDenominator:3];

[frac2 setNumerator:1];
[frac2 setDenominator:5];

NSLog(@"First fraction is: ");
[frac1 print];

NSLog(@"Second fraction is: ");
[frac2 print];
}
return 0;
}

运行程序,得到如下输出:
[img]http://dl.iteye.com/upload/attachment/0078/5864/ed8369dc-2b13-323d-bec7-f5e76b512623.png[/img]
说明我们程序的编写是没有问题的。回过头来看[b]Fraction *frac1=[[Fraction alloc] init];[/b]这说明我们声明了一个指针类型的引用变量*frac1,创建的对象是Fraction,在alloc后内存中创建出该对象并返回内存地址给指针变量*frac1,申请完空间需要对对象进行初始化,所以就用到了init方法。
从本例中可以看出,每创建一个新对象时,它都会有自己的一组实例变量。上面我们给出的是为实例变量复制的set方法,但如果想通过对象引用来访问实例变量,在O-C中却做不到,此时我们需要编写新的方法来获取实例变量的值,这里就涉及到了“数据封装”这个概念。这个机制使得定义类的人不用担心使用类的人会不会破坏类的结构,他们完全被隔离了。
那么我们需要编写新的方法来获取实例变量的值,修改头文件如下:

#import <Foundation/Foundation.h>

@interface Fraction : NSObject

-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(int) numerator;
-(int) denominator;
@end

也就是在类的定义中加入了两个方法,其返回值都是int,根据方法名我们可以看出这是要分别获取numerator和denominator的值。那么方法的实现为:

-(int) numerator
{
return numerator;
}

-(int) denominator
{
return denominator;
}

当然方法的实现也是很简单的,就是返回这个变量的值即可,那么我们继续修改程序如下所示(主函数部分如下,其余内容和之前相同):

int main(int argc, const char * argv[])
{
@autoreleasepool {
Fraction *myFraction=[[Fraction alloc] init];

[myFraction setNumerator:1];
[myFraction setDenominator:3];

NSLog(@"The value of myFraction is %i/%i",[myFraction numerator],[myFraction denominator]);
}
return 0;
}

我们运行程序,就会得到如下输出:
[img]http://dl.iteye.com/upload/attachment/0078/5867/20c112d1-8f48-3aa5-8dde-63bf8452f06a.png[/img]
这里在NSLog的参数列表中,我们使用了numerator方法和denominator方法来分别获取各自的值。
[url=http://sarin.iteye.com/blog/1756872]接下文[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值