(转载)OC学习篇之---类的定义

之前已经介绍了OC中的一个程序HelloWorld,今天我们继续学习OC中类的相关知识。

OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那么对类和对象的概念就不陌生了,因为Java是非常纯正的面向对象设计语言。关于类和对象的概念,这里就不仔细介绍了,网上有各种解释。我们之间来开一下OC中如何定义一个类,如何实例化出一个对象等。

首先我们新建一个工程,系统会自动创建main.m文件的,这时候,我们右键项目,选择New File..

然后选择OS X中的Source,在选择Cocoa Class,点击下一步

点击下一步

这里填写以下类的名称,这个和Java中是类似的了,点击下一步:

我们可以看到,新建了一个Person类,但是这个和Java就有点区别了,一个类是有两部分构成的,一个是类的头文件Person.h(一般是在该文件中做定义工作的),还有一个是Person.m文件,这个一般是实现头文件中定义的内容。这个也是延续了C语言中的项目结构吧。一般头文件只负责定义功能,.c文件负责实现具体功能的。这里也是类似吧。

下面来看一下Person.h头文件中类的定义格式:

 1 //  Person.h
 2 //  02_ClassDemo
 3 //
 4 //  Created by jiangwei on 14-10-10.
 5 //  Copyright (c) 2014年 jiangwei. All rights reserved.
 6 //
 7
 8 #import <Foundation/Foundation.h>
 9
10 @interface Person : NSObject{
11     //在{}中定义属性(全局变量/实例变量)
12     //注意:只能定义不能赋值,因为这里只是在做声明操作,不能赋值的
13     //加上下划线,为了区分局部变量
14     NSString *_name;//姓名,默认值是nil:空指针,可以查看定义:#define nil NULL
15     NSInteger _age;//年龄,默认值是0
16 }
17
18 //定义方法
19 //-:实例方法,+:类方法
20 //格式:方法说明 (返回类型) 方法名 : (参数类型)参数名称
21 //注意方法名是shopping:,不是shopping,这个要注意
22 - (void)shopping:(float)price;
23
24 //定义方法设置属性值(注意setXXX)
25 - (void)setName:(NSString *)name;
26 - (void)setAge:(NSInteger)age;
27
28 //定义方法的获取属性值(注意不是getXXX,而是直接的属性名,因为getXXX在OC中还有其他用途)
29 - (NSString *)name;
30 - (NSInteger)age;
31
32 //多个参数的方法定义
33 //方法名两部分组成的:setName: setAge:
34 - (void)setName:(NSString *)name setAge:(NSInteger)age;
35 //或者方法名:setName: :,后面的可以省略,但是这种方式不建议使用
36 //- (void)setName:(NSString *)name :(NSInteger)age;
37
38 //类方法
39 //在这个方法中是无法访问属性的,因为属性是属于对象的,不是类的
40 + (Person *)newPerson;
41 @end  

首先看到类的定义的关键字是:

@interface

1 //一般类的定义格式为:
2
3 @interface /*类名*/:NSObject{
4
5 //定义属性
6
7 }

定义方法

这里有几点需要说明:

1、OC中任何一个类都是继承NSObject,这个和Java中的Object是一个概念的,所以这里需要导入

1 #import <Foundation/Foundation.h>

其实Java中的Object对象是在java.lang.*包中的,不过Java并不会导入这个包,因为Object类的类加载器决定的,不需要导入的.

2、这里的继承符号和C++中是一样的,使用冒号:

3、在{}类定义类的属性,关于这里所说的属性和Java中的属性不是一个概念了,OC中只要定义在{}中的字段就是类的属性,而Java中是有getXXX/setXXX的方法,才叫属性。同时也得注意,OC中类中定义的属性名是以下划线:"_"开头,为什么要这样做,就是为了区分后面的局部变量与其重名了,当然我们在Java中一般是以m开头,或者其他方式,Java中没有那么强的规范,但是OC中还是强烈建议用这种方式的,还有一点要注意,在定义设置方法的时候,一般样式是setXXX,但是在定义取值的方法的时候直接是XXX,而不是getXXX了,这个也是和Java有区别的,至于为什么这么做,因为get开头的方法已经有其他用处了,后面会说到。这里就注意一下就可以了。

4、在属性定义的后面就是简单的定义方法了

下面在来看一下如何定义方法:

OC中定义方法和Java语言有很大的不同,所以这里很难记住,如果不常用的话,看一下方法的定义格式:

方法说明 (返回类型) 方法名 : (参数类型)参数名称

1、方法说明有两种:

一种是减号:"-",表示该方法是对象方法,就是必须用对象实例才能调用的

一种是加号:"+",表示该方法是类方法,就是可以用类直接调用的,不需要实例化对象的,类似于Java中的static方法

2、返回类型:这个就简单了,和Java语言很类似了

3、方法名:方法名和Java中就不太一样了,看个例子:

1 //注意方法名是shopping:,不是shopping,这个要注意
2 - (void)shopping:(float)price;  

这个方法的方法名是

shopping: 是包含冒号的,再看个例子:

1 //多个参数的方法定义
2 //方法名两部分组成的:setName: setAge:
3 - (void)setName:(NSString *)name setAge:(NSInteger)age;  

多参数的方法定义,那么这个方法的方法名就是setName:setAge:

4、(参数类型)参数名称:这个和Java也是有很大的区别的,感觉像是和Java中定义的相反了,他用括号把类型括起来了。OC中的对象类型和Java中的使用不一样,OC中的对象类型相当于C中指针定义样式(类名 *),这点需要注意。

当然在类定义的结束地方使用@end关键字的

看完了类的定义,下面在来看一下类的具体实现了:

Person.m

 1 //
 2 //  Person.m
 3 //  02_ClassDemo
 4 //
 5 //  Created by jiangwei on 14-10-10.
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.
 7 //
 8
 9 #import "Person.h"
10
11 @implementation Person
12
13 //实现方法
14 - (void) shopping : (float)price{
15     NSLog(@"%@ shopping %f",_name,price);
16 }
17
18 - (void)setName:(NSString *)name{
19     _name = name;
20 }
21 - (void)setAge:(NSInteger)age{
22     _age = age;
23 }
24 - (NSString *)name{
25     return _name;
26 }
27 - (NSInteger)age{
28     return _age;
29 }
30 - (void)setName:(NSString *)name setAge:(NSInteger)age{
31     _name = name;
32     _age = age;
33 }
34 + (Person *)newPerson{
35     return [[Person alloc] init];
36 }
37
38 @end  

看到类的实现使用的是 @implementation 关键字。

在实现的源文件中,必须导入类的定义的头文件:

1 #import "Person.h"

这样的一种形式,和C语言中的工程结构非常相似。

然后就是对头文件中定义的一些方法的具体实现了,而且在实现文件中,我们可以访问类中定义的属性。其他的就没有什么难度了,就不在细说了,同样的类的结束标志:

1 @end

类定义和实现都介绍完了,下面来看一下如何使用吧:

main.m

 1 //
 2 //  main.m
 3 //  02_ClassDemo
 4 //
 5 //  Created by jiangwei on 14-10-10.
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.
 7 //
 8
 9 //类的定义放在.h文件中
10 //类的实现放在.m文件中
11
12 //定义一个类的步骤
13 //定义类名、编写类的属性、编写类的行为
14
15 #import <Foundation/Foundation.h>
16
17 #import "Person.h"
18
19 int main(int argc, const charchar * argv[]) {
20     @autoreleasepool {
21         //创建对象
22         //在内存中申请一块内存区域
23         //Person *person = [Person alloc];
24         //调用初始化方法,初始化一些默认数据
25         //可能上面申请的内存之前有被使用过,还会有以前的数据。所以我们需要将其数据清空,这时候就会将默认值进行赋值(相当于清空操作)
26         //person = [person init];
27
28         //合并
29         //这里申请了两块内存:一个是对象指针变量,一个是alloc申请的
30         //可以看出alloc/init方法是类方法、可以查看NSObject对象的定义
31         Person *person = [[Person alloc] init];
32
33         //还有另外的一种方式创建一个对象,但是这种方式不建议使用,因为这种方式相当于把上面的两个合并
34         //有时候我们需要将上面的两个步骤进行分开操作的
35         //Person *person1 = [Person new];
36
37         //设置名字
38         [person setName:@"jaingwei"];
39
40         //调用实例方法shopping
41         [person shopping:200];
42
43         Person *person1 = [[Person alloc] init];
44         [person1 setName:@"huangdaoyang"];
45         [person1 shopping:300];
46         //同时设置两个属性的值,但是这种方式不建议使用,建议使用set方法
47         [person1 setName:@"huangdaoyang" setAge:22];
48
49         //get方法调用
50         NSString *person_name = [person name];
51         NSLog(@"name is %@",person_name);
52         NSString *person1_name = [person1 name];
53         NSLog(@"name is %@",person1_name);
54
55         //类方法调用
56         Person *person2 = [Person newPerson];
57         [person2 setName:@"shixin" setAge:22];
58         [person2 shopping:400];
59
60         //空指针
61         Person *person3 = nil;
62         //不执行任何操作,但是也不会报错空指针异常
63         [person3 setName:@"空对象" setAge:22];
64
65
66     }
67     return 0;
68 }  

OC中实例化一个对象的方式是:

1 Person *person = [[Person alloc] init];  

首先是指针类型的样式定义一个变量,然后是调用类的alloc方法,接着调用init方法,这里有点比较奇怪,我们在定义Person类的时候,没有定义alloc和init方法,这里为什么不报错呢?这个就和Java很相似了,因为OC中任何类都是集成NSObject类的,那么自然想到了这两个方法是NSObject定义的。而且我们可以看到alloc方法是类方法,init是对象方法。

同时,OC中的方法调用方式:

1 //对象方法:[对象变量  方法名 参数]
2 //类方法:[类名  方法名 参数]

这里实例化一个对象和Java中有很大的区别的,Java中直接new一个就可以了。这里需要调用两个方法alloc和init

可以这么理解吧:alloc相当于给这个对象分配内存空间,init是调用这个类的构造方法,对属性和字段进行初始化操作

当然上面的实例化操作也可以变成两步:

1 Person *person = [Person alloc];
2 //调用初始化方法,初始化一些默认数据
3 //可能上面申请的内存之前有被使用过,还会有以前的数据。所以我们需要将其数据清空,这时候就会将默认值进行赋值(相当于清空操作)
4 person = [person init];  

但是OC中建议的方式还是上面那种。

对象方法的调用,设置名字:

1 //设置名字
2 [person setName:@"jaingwei"];  

多个参数的对象方法调用,同时设置名字和年龄

1 //同时设置两个属性的值,但是这种方式不建议使用,建议使用set方法
2 [person1 setName:@"huangdaoyang" setAge:22];  

类方法的调用:

1 //类方法调用
2 Person *person2 = [Person newPerson];  

总结

好了,关于OC中类的定义以及实现,如何使用就介绍到这里了,我们在学习的过程中可以和一门面向对象语言相比较学习,这样可能会学习的快点。

时间: 2024-08-12 09:54:58

(转载)OC学习篇之---类的定义的相关文章

OC学习篇之---类的定义

之前已经介绍了OC中的一个程序HelloWorld:http://blog.csdn.net/jiangwei0910410003/article/details/41578003,今天我们继续学习OC中类的相关知识. OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那么对类和对象的概念就不陌生了,因为Java是非常纯正的面向对象设计语言.关于类和对象的概念,这里就不仔细介绍了,网上有各种解释.我们之间来开一下OC中如何定义一个类,如何

(转载)OC学习篇之---类的三大特性:封装,继承,多态

之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性: 一.封装 学习过Java中类的同学可能都知道了,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java中有四种访问权限修饰符:public,default,protected,private,访问权限一次递减的,这样我们在定义类的时

(转载)OC学习篇之---类目的概念和使用

上一篇文章介绍了OC中的@class关键字的使用,这一篇我们介绍一下,OC中的一个特有的亮点:类目 首先我们来看一下场景,如果我们现在想对一个类进行功能的扩充,我们该怎么做? 对于面向对象编程的话,首先会想到继承,但是继承有两个问题: 第一个问题:继承的前提是这个类可以被继承,因为在Java中有些类是不允许继承的,定义成final类,同样的OC中也是有不可以继承的类. 第二个问题:这个类可以被继承,但是继承我们知道是侵入性的,就是我可能只是想实现一个功能,但是继承之后,子类就会把父类的所有功能(

(转载)OC学习篇之---类的初始化方法和点语法的使用

昨天介绍了OC中类的定义和使用,今天我们来继续学习类的初始化方法和点语法的使用. 一.首先来看一下类的初始化方法 在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的,但是这里有一个区别是:Java中有默认构造方法,当我们去自定义构造方法的时候,这个默认构造方法就会被替换了,但是OC中是不会的,这点需要注意. 下面来看一下如何自定义初始化方法: Person.h 1 // 2 // Person.h 3 // 03_InitDemo 4 // 5 // Creat

OC学习篇之---类的三大特性(封装,继承,多态)

之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性: 一.封装 学习过Java中类的同学可能都知道了,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java

OC学习篇之---类目的概念和使用

上一篇文章介绍了OC中的@class关键字的使用http://blog.csdn.net/jiangwei0910410003/article/details/41774747,这一篇我们介绍一下,OC中的一个特有的亮点:类目 首先我们来看一下场景,如果我们现在想对一个类进行功能的扩充,我们该怎么做? 对于面向对象编程的话,首先会想到继承,但是继承有两个问题: 第一个问题:继承的前提是这个类可以被继承,因为在Java中有些类是不允许继承的,定义成final类,同样的OC中也是有不可以继承的类 第

OC学习篇之---类的初始化方法和点语法的使用

一.首先来看一下类的初始化方法 在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的,但是这里有一个区别是:Java中有默认构造方法,当我们去自定义构造方法的时候,这个默认构造方法就会被替换了,但是OC中是不会的,这点需要注意. 下面来看一下如何自定义初始化方法: Person.h [objc] view plain copy // //  Person.h //  03_InitDemo // //  Created by jiangwei on 14-10-1

(转载)OC学习篇之---类的延展

前一篇文章我们介绍了类的类目概念和使用,那么这篇文章我们继续来介绍一下OC中的一个特性:延展. 其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前必须要声明一个这个函数,就是有前置性. OC中为了弥补C语言中的这个问题,就有了延展的概念,下面来看一下代码: Person.h 1 // 2 // Person.h 3 // 10_CategoryExtend 4 // 5 // Created by jiangwei on 14-10-11.

OC学习篇之---类的延展

前一篇文章我们介绍了类的类目概念和使用:http://blog.csdn.net/jiangwei0910410003/article/details/41775329,那么这篇文章我们继续来介绍一下OC中的一个特性:延展 其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前必须要声明一个这个函数,就是有前置性. OC中为了弥补C语言中的这个问题,就有了延展的概念,下面来看一下代码: Person.h // // Person.h // 10_