黑马程序员技术交流社区
标题:
【Objective-C】05-第一个OC的类 - M了个J - 博客园
[打印本页]
作者:
隔壁老王
时间:
2015-7-24 23:22
标题:
【Objective-C】05-第一个OC的类 - M了个J - 博客园
创建时间: 2015-7-23 22:57
修改时间: 2015-7-23 22:57
来源: http://www.cnblogs.com/mjios/archive/2013/04/06/3002814.html
本文目录
一、语法简介
二、用Xcode创建第一个OC的类
三、第一个类的代码解析
四、添加成员变量
五、添加方法
六、跟Java的比较
七、创建对象
八、访问公共成员变量和方法
说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C。如果你还没有编程经验,或者对Objective-C、iOS开发不感兴趣,请忽略。学习本专题之前,建议先学习C语言专题。
OC是一门面向对象的语言,因此它也有类、对象、静态\动态方法、成员变量的概念。这讲就来创建第一个OC的类。
回到顶部
一、语法简介
1.类
在Java中,我们用1个.java文件就可以描述清楚一个类;在OC中,一般用2个文件来描述一个类:
1> .h:类的声明文件,用于声明成员变量、方法。类的声明使用关键字@interface和@end。
注意:.h中的方法只是做一个声明,并不对方法进行实现。也就是说,只是说明一下方法名、方法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码。
2> .m:类的实现文件,用于实现.h中声明的方法。类的实现使用关键字@implementation和@end。
2.方法
1> 方法的声明和实现,都必须以 + 或者 - 开头
+ 表示类方法(静态方法)
- 表示对象方法(动态方法)
2> 在.h中声明的所有方法作用域都是public类型,不能更改
3.成员变量
成员变量的常用作用域有3种:
1> @public 全局都可以访问
2> @protected 只能在类内部和子类中访问
3> @private 只能在类内部访问
比Java少了一种作用域:包权限作用域,原因很明显:OC没有包名的概念。
回到顶部
二、用Xcode创建第一个OC的类
1.右击项目文件夹或者文件,选择"New File"
2.选择Cocoa的"Objective-C class"
3.输入类名和选择父类
这里的类名为Student,父类是NSobject
4.创建完毕后,项目中多了两个文件
* Student.h是类的声明文件,Student.m是类的实现文件
* 默认情况下,这2个文件的文件名跟类名一致
* 编译器只会编译.m文件,并不会编译.h文件
回到顶部
三、第一个类的代码解析
1.Student.h - 类的声明文件
1#import 2 3 @interface Student : NSObject 4 5 @end
1> 看第3行,OC中使用关键字@interface来声明一个类,@interface后面紧跟着类名Student。
2> 类名Student后面的冒号":"表示继承,即第3行代码的意思是Student继承自NSObject。
3> 因为NSObject被声明在Foundation.h中,所以在第1行用#import包含了Foundation.h文件。
4> 第5行的@end表示类的声明结束了。@interface和@end是配套使用的。
2.Student.m - 类的实现文件
1#import"Student.h"23@implementation Student45@end
1> 看第3行,OC中使用关键字@implementation来实现一个类。@implementation后面紧跟的类名,表示究竟要实现哪一个类。
2> 因为Student这个类是声明在Student.h中的,所以在第1行用#import包含了Student.h文件。如果你不包含Student.h,第3行代码肯定报错,因为它根本不知道Student是个什么鬼东西。
3> 第5行的@end表示类的实现结束了。@implementation和@end是配套使用的。
回到顶部
四、添加成员变量
正常情况下,我们都是把成员变量定义在头文件中,也就是类的声明文件(.h)中
1.给Student添加一个成员变量
复制代码
1#import 2 3 @interface Student : NSObject { 4 int age; // 年龄 5 } 6 7 @end
复制代码
1> 第4行定义了一个int类型的成员变量age,age的默认作用域是@protected,即可以在Student类内部和子类中访问
2> 成员变量必须写在大括号{ }里面
2.设置成员变量的作用域
接下来给Student增加几个不同作用域的成员变量
复制代码
1#import 2 3 @interface Student : NSObject { 4 int age; // 年龄 5 6 @public 7 int no; // 学号 8 int score; // 成绩 9 10 @protected 11 float height; // 身高 12 13 @private 14 float weight; // 体重 15 } 16 17 @end
复制代码
一共有5个成员变量,其中
@public作用域的有:no、score
@protected作用域的有:age、height
@private作用域的有:weight
回到顶部
五、添加方法
前面我们定义了一个成员变量age,它的作用域是@protected,外界不能直接访问它。为了保证面向对象数据的封装性,我们可以提供age的get方法和set方法,让外界间接访问age。接下来在Student中添加age的get方法和set方法。
1.在Student.h中声明方法
复制代码
1#import 2 3 @interface Student : NSObject { 4 int age; // 年龄 5 6 @public 7 int no; // 学号 8 int score; // 成绩 9 10 @protected 11 float height; // 身高 12 13 @private 14 float weight; // 体重 15 } 16 17 // age的get方法 18 - ( int )age; 19 20 // age的set方法 21 - ( void)setAge:( int )newAge; 22 23 @end
复制代码
1> 第18行声明了age的get方法,方法名就叫做age,OC建议get方法的名字跟成员变量保持一致(如果是在Java中,就应该叫做getAge)
2> 第18行最面的 - 表示这是一个动态方法( + 则表示静态方法)。age前面的(int)表示方法的返回值为int类型,方法的返回值和参数类型都需要用小括号()包住
3> 第21行声明了age的set方法,前面的 - 表示动态方法,(void)表示方法没有返回值
4> 在OC方法中,一个冒号:对应一个参数。由于第21行age的set方法接收一个int类型的参数,参数名为newAge,所以(int)newAge前面有一个冒号:
5> 一定要记住:一个冒号:对应一个参数,而且冒号:也是方法名的一部分。因此第21行set方法的方法名是setAge:,而不是setAge
再加大一下难度,假如增加一个方法可以同时设置age和height,那么就应该这样写:
1 - (void)setAge:(int)newAge andHeight:(float)newHeight;
* 这个方法是动态方法、没有返回值,接收2个参数,所以有2个冒号:
* 这个方法的方法名是setAge:andHeight:
* 其实andHeight是可以省略的,它只是为了让方法名念起来通顺一点,也让(float)newHeight前面的冒号:不那么孤单
2.在Student.m中实现方法
前面已经在Student.h中声明了3个方法,接下来一一实现它们
复制代码
1#import"Student.h" 2 3@implementation Student 4 5// age的get方法 6 - (int)age { 7// 直接返回成员变量age 8return age; 9}1011// age的set方法12 - (void)setAge:(int)newAge {13// 将参数newAge赋值给成员变量age14 age = newAge;15}1617// 同时设置age和height18 - (void)setAge:(int)newAge andHeight:(float)newHeight {19 age = newAge;20 height = newHeight;21}22@end
复制代码
第6行对age方法进行了实现,第12行对setAge:方法进行了实现,第18行对setAge:andHeight:方法进行了实现
回到顶部
六、跟Java的比较
如果是在Java中,一个Student.java文件就可以搞定成员变量和方法
复制代码
1publicclass Student { 2protectedint age; 3protectedfloat height; 4 5publicint no; 6publicint score; 7 8privatefloat weight; 910/**11 * age的get方法12*/13publicint getAge() {14return age;15 }1617/**18 * age的set方法19*/20publicvoid setAge(int newAge) {21 age = newAge;22 }2324/**25 * 同时设置age和height26*/27publicvoid setAgeAndHeight(int newAge, float newHeight) {28 age = newAge;29 height = newHeight;30 }31 }
复制代码
回到顶部
七、创建对象
前面已经定义了一个Student类,成员变量和方法都有了,接下来看一下怎么使用这个类创建对象。
由于OC程序的入口点是main函数,所以在main.m文件中演示Student类的使用。
先上完整代码
复制代码
1#import 2 #import " Student.h " 3 4 int main( int argc, const char * argv[]) 5 { 6 @autoreleasepool { 7 Student *stu = [[Student alloc] init]; 8 9 [stu release]; 10 } 11 return 0 ; 12 }
复制代码
1.包含Student.h
因为要用到Student这个类,所以在第2行包含了它的头文件
#import"Student.h"
作者:
skywan
时间:
2015-7-25 10:06
很棒。。。。
作者:
ylxkab
时间:
2015-7-25 23:29
内容真多啊
作者:
你好再见
时间:
2015-7-25 23:36
娇姐今天点你名了
作者:
花漾
时间:
2015-7-25 23:38
真是拿生命在混分
作者:
隔壁老王
时间:
2015-7-25 23:43
花漾 发表于 2015-7-25 23:38
真是拿生命在混分
大家都不容易啊
作者:
隔壁老王
时间:
2015-7-25 23:46
skywan 发表于 2015-7-25 10:06
很棒。。。。
来混分的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2