文章目录
- 类
- 对象
对象和类
面向对象的程序设计过程中有两个重要概念:类(class)和对象(object,也可称为实例,instance),其中类是某一批对象的抽象,可以把类理解成某种概念;对象才是一个具体存在的实体,从这个意义上看,我们日常所说的人其实都是人的实例,而不是人类
类
类是面向对象的重要内容,我们可以把类当成一种自定义数据类型,可以使用类来定义变量,这种类型的变量相当于指针类型的变量。也就是说,所有的类都是指针类型的变量。
定义类
Objective-C中定义类需要分为两个步骤。
1. 接口部分:定义该类包含的成员变量和方法
a. 用 @interface声明定义的接口部分,@end表明定义结束。
b. 接口部分的源代码应该命名为 .h文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
//定义成员变量
NSString* _name;
int _age;
}
//定义一个setName: andAge:方法
-(void) setName:(NSString*) name andAge:(int) age;
//下面定义一个say方法,并不提供实现
-(void) say:(NSString *) content;
//下面定义一个不带形参数的方法
-(NSString*) info;
//定义一个类方法
+(void) foo;
@end
其中紧跟该类的一对花括号用于声明该类的成员变量;花括号后面的部分用于声明该类的方法
2. 实现部分:为该类的方法提供实现
实现部分的源代码应该命名为 *.m文件
#import "Person.h"
@implementation Person
{
//定义来一个只能在实现部分使用的成员变量(被隐藏的成员变量)
int _testAttr;
}
//实现一个setName: andAge: 方法
-(void) setName:(NSString *)name andAge:(int)age
{
_name = name;
_age = age;
}
//下面实现了一个say方法
-(void) say:(NSString *)content
{
NSLog(@"%@",content);
}
//下面实现了不带形参的info方法
-(NSString*) info
{
[self test]; //self是调用该方法的对象
return [NSString stringWithFormat:@"姓名:%@, 年龄%d",_name,_age];
}
//定义一个只能在实现部分使用的方法(被隐藏的方法)
-(void) test
{
NSLog(@"--只能在实现部分使用的方法----");
}
//实现了一个类方法
+(void) foo
{
NSLog(@"类的方法,通过类名调用,类似Java");
}
@end
关于类的实现
- 实现部分必须为接口部分的所有方法提供实现。除此之外,实现部分也可定义隐藏的成员变量和方法。
- 类实现部分的类名必须与类接口部分的类名相同,用于表示这是同一个类的接口部分和实现部分
- 类实现部分也可以在类名后面使用 “:父类” 来表示集成了某个父类,但一般没有必要,因此,通常都不会这么做
- 类实现部分也可声明自己的成员变量,但这些成员变量只能在当前类内访问。因此,再类实现部分声明成员变量相当于定义隐藏的成员变量
图示:
对象
在前面定义类之后,接下来就可以使用该类了,可从如下 3 方面来使用类
- 定义变量:
类名 * 变量名
- 创建对象:
[[ 类名 alloc ] 初始化方法]
- 调用类方法:
[调用者 方法名:参数 形参标签:参数值 ...
在上面的语法中,alloc是Objective-C的关键字,该关键字负责为该类分配内存空间、创建对象。除此之外,还需要调用初始化方法对该实例执行初始化。由于所有的对象都继承了NSObject类,因此所有的类都有一个默认的初始化方法:init
注: Objective-C规定:实例方法(以-声明的方法)必须用实例来调用;二类方法(以+声明的方法)则必须使用类调用——这也符合现实规则:每个人的方法,都只能由于他自己调用
#import <Foundation/Foundation.h>
#import "Person.h" //导入类的接口部分即可
int main(int argc, const char * argv[]) {
@autoreleasepool {
//定义Person* 类型的变量
Person* person;
//创建Person对象,赋值给person变量赋值
person = [[Person alloc] init];
//OC允许直接通过对象来访问成员变量,不过有权限的设置(对象->成员变量名)
//调用有参数的方法,必须传入参数;
[person say:@"我必须学好OC"];
[person setName:@"HUXU" andAge:25];
//调用无参数的方法,不需要传入参数
//方法有返回值,可以定义一个类型匹配的变量,来接受返回值
NSString* info = [person info];
NSLog(@"person的info是:%@",info);
//调用test方法是不行滴,[person test];因为test方法是在实现部分定义的
//通过类名直接调用方法
[Person foo];
}
return 0;
总结: 这周主要学习了类和对象的定义和使用,跟着书学着打代码,从这一章开始就和之前学的完全不一样了,还要继续练习消化新的概念。