您的位置:首页 > 其它

OC02 实例变量可见度和方法-1

2015-11-02 23:07 477 查看
Person.h

#import <Foundation/Foundation.h>

#pragma mark --3种实例变量的可见度
@interface Person : NSObject{

// 实例变量默认的可见度是protected:只能在本类和继承自本类的子类中直接访问到。
NSString *_name;

@private // 私有的可见度:只能在本类中直接访问,在继承自本类或其他地方无法返回问该实例变量
NSString *_gender;

@public // 共有的可见度:可以再任何一个地方访问到这种可见度的实例变量
int _age;
}

#pragma mark --OC中的方法

// OC中的方法分为类方法,和实例方法,分别用+或—作为方法类型标示符

// 类方法只能用类名调用,实例方法只能由对象来调用。由于我们在开发中很少直接使用类方法,所以经常定义的是实例方法,但这并不代表我们不能自己定义类方法。

// -:标示方法的类型

//(void):方法的返回值类型

// replaceAtIndex/withObject:方法参数的说明(一般是形容参数的作用及这个方法实现的功能)

// (NSInteger)/(id):标示参数的类型

// index/object:表示参数的名字

// 冒号(很重要):表示后边紧跟的是参数类型及参数名,一个方法名中有几个冒号,就有几个参数。

#pragma mark -如何确定方法名

// 如何确定方法名:去掉方法的类型符号、返回类型、参数类型、参数名,剩下的参数形容词和冒号就是方法名。切记:冒号不能省,因为冒号标志着方法的个数。

// 方法名不能重复,但是,如果方法的类型不同,则方法名可以相同

//- (void)replaceAtIndex: (NSInteger)index withObject: (id)object;

//- (void)exchangeName: (NSString *)name1 withName: (NSString *)name2;

//+ (void)replaceAtIndex: (NSInteger)index withObject: (id)object;

#pragma mark -声明一个方法,包含三个参数,但是要修改的话要同时修改,因此不常用,而要分开。
- (void)setWithName: (NSString *)name
gender: (NSString *)gender
age: (int)age;

#pragma mark -setter,getter方法的声明

/*

* 1、 因为默认的实例变量可见度是@protected,只能在本类和继承自本类的子类中访问到,所以,我们需要有一个方法,提供在外部访问、修改实例变量的功能,这样的一对儿方法就是setter、getter方法

* 2、 setter方法的书写规则:- (void)set+首字母大写的实例变量名:(参数类型)首字母小写的实例变量名

* 3、 getter方法的书写规则:- (实例变量的类型)首字母小写的实例变量名

* 4、 setter方法本质:使用一个带参数的方法来在类的内部修改实例变量的值为参数的值

* 5、 getter方法本质:使用return语句来将实例变量的值的首地址(对象)返回到类的外部

*/

// name的赋值方法 即setter方法(设置器)
- (void)setName:(NSString *)name;

// name的取值方法 即getter方法(访问器)

- (NSString *)name; //- (NSString *)getName;也行

// gender实例变量的setter方法
- (void)setGender:(NSString *)gender;

// gender实例变量的getter方法
- (NSString *)gender;

// age实例变量的setter方法
- (void)setAge:(int)age;

// age实例变量的getter方法
- (int)age;

@end

Person.m

#import "Person.h"

@implementation Person

#pragma mark --重写系统提供的初始化方法

// 重写系统提供的初始化方法来定制自己需要的实例变量的值!

- (instancetype)init{

_name = @"张三"; //
_name的可见度是默认的、受保护的可见度(protected),在类的内部可以直接访问。

return self;
}

#pragma mark --实现一个方法,包含三个参数,但是要修改的话要同时修改,因此不常用,而要分开。
- (void)setWithName: (NSString *)name gender: (NSString *)gender
age: (int)age{
_name = name;
_gender = gender;
_age = age;
}

#pragma mark -setter,getter方法的实现

// 实现name的赋值方法
- (void)setName:(NSString *)name{
_name = name;
}

// 实现name的取值方法
- (NSString *)name{
return _name;
}

// 实现gender实例变量赋值方法
- (void)setGender:(NSString *)gender{
_gender = gender;
}

// 实现gender实例变量取值方法
- (NSString *)gender{

return _gender;
}

// age实例变量的赋值方法
- (void)setAge:(int)age{
_age = age;
}

// age实例变量的取值方法
- (int)age{
return _age;
}

@end

@implementation Person

#pragma mark --重写系统提供的初始化方法

// 重写系统提供的初始化方法来定制自己需要的实例变量的值!

- (instancetype)init{

_name = @"张三"; //
_name的可见度是默认的、受保护的可见度(protected),在类的内部可以直接访问。

return self;
}

#pragma mark --实现一个方法,包含三个参数,但是要修改的话要同时修改,因此不常用,而要分开。
- (void)setWithName: (NSString *)name gender: (NSString *)gender
age: (int)age{
_name = name;
_gender = gender;
_age = age;
}

#pragma mark -setter,getter方法的实现

// 实现name的赋值方法
- (void)setName:(NSString *)name{
_name = name;
}

// 实现name的取值方法
- (NSString *)name{
return _name;
}

// 实现gender实例变量赋值方法
- (void)setGender:(NSString *)gender{
_gender = gender;
}

// 实现gender实例变量取值方法
- (NSString *)gender{

return _gender;
}

// age实例变量的赋值方法
- (void)setAge:(int)age{
_age = age;
}

// age实例变量的取值方法
- (int)age{
return _age;
}

@end

Man.h

#import "Person.h"

@interface Man : Person{
NSString *_address;
NSString *_hobby;
}

- (void)setAddress: (NSString *)address;
- (NSString *)address;

- (void)setHobby: (NSString *)hobby;
- (NSString *)hobby;

@end

Man.m

#import "Man.h"

@implementation Man

- (instancetype)init{

_name = @"李四"; // 因为_name是继承自Person的实例变量,因为是proteced修饰的,所以可以在子类中访问到

// _gender = @"男"; // 因为_gender是@private修饰的实例变量,即使是子类,也访问不到这个实例变量

_age = 23; //
_age是@public修饰的实例变量,在子类中可以访问到

return self;

}

- (void)setAddress: (NSString *)address{
_address = address;
}
- (NSString *)address{

return _address;
}

- (void)setHobby: (NSString *)hobby{
_hobby = hobby;
}
- (NSString *)hobby{
return _hobby;
}

@end

Car.h

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
int _price;
NSString *_No;
NSString *_brand;
}

#pragma mark 自定义初始化方法

// 自定义初始化方法

// 自定义的初始化方法,必须用init开头!!!!!!-(id)开头
- (id)initWithPrice: (int)price
No: (NSString *)no
Brand: (NSString *)brand;

// setter,getter
-(void)setPrice: (int)price;
- (int)price;

@end

Car.m

#import "Car.h"

@implementation Car

#pragma mark 自定义初始化方法de实现

- (id)initWithPrice:(int)price No:(NSString *)no
Brand:(NSString *)brand{

_price = price;
_No = no;
_brand = brand;

return self;
}

// setter,getter实现
-(void)setPrice: (int)price{
_price = price;
}
- (int)price{
return _price;
}

@end

Main.m

#import <Foundation/Foundation.h>

#import "Person.h"// 引入Person类声明!

#import "Man.h"// 引入Man类声明!

#import "Car.h"// 引入Car类声明!

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

#pragma mark -访问实例变量

// 创建一个person对象
Person *person1 = [[Person alloc] init];

// person1->_name = @"刘蜀葵"; // 因为_name是protected可见度,所以在这里不能直接访问

// person1->_gender = @"男"; // 因为_gender是@private修饰的可见度,所以在这里不能直接访问

person1->_age = 23; // 因为_age是@public修饰的可见度,所以可以在这里访问到
NSLog(@"%@", [person1 name]);

#pragma mark --同时修改多个实例变量

// OC中的方法调用叫做“消息发送”,向某个对象发送某消息。

// [receive message]

[person1 setWithName: @"周润发" gender:@"男" age: 55]; // 与C中函数调用不同,由对象进行调用。对象person1调用setWithName方法,也即setWithName向对象发送消息,这是一个消息发送机制。(消息发送者:程序员)。
NSLog(@"%@", [person1 name]);

#pragma mark --一次只修改一个实例变量

// 调用Person的name实例变量的赋值方法,修改姓名
[person1 setName:@"刘德华"];
NSLog(@"%@", [person1 name]);

// 调用Person的gender实例变量的赋值方法,修改性别
[person1 setGender:@"女"];
NSLog(@"%@", [person1 gender]);

// 调用Person的age实例变量的赋值方法,修改年龄
[person1 setAge:22];
NSLog(@"%d", [person1 age]);

#pragma mark -调用Man类的address和hobby的setter方法

// 调用address和hobby的setter方法赋值; 调用getter方法访问成员变量的值
Man *man1 = [[Man alloc] init];

[man1 setAddress:@"兰州市"];
NSLog(@"%@",[man1 address]);

[man1 setHobby:@"吃饭睡觉打豆豆"];
NSLog(@"%@",[man1 hobby]);

#pragma mark -调用Car类的调用自定义初始化方法,在初始化过程的同时给实例变量 动态赋值。

// 调用自定义初始化方法,在初始化过程的同时给实例变量赋值。如果只是重写父类的初始化方式,则只能给实例变量设置默认值,不能在创建对象的过程中动态赋值。(但是两者相比,前者效率更高!!!)
Car *car1 = [[Car alloc] initWithPrice:200 No:@"陕A315970520" Brand:@"BMW"];
NSLog(@"%d", [car1 price]);

#pragma mark 总结
/*

学习了使用实例变量可见度和方法

.h中实例变量默认的可见度是protected:只能在本类和继承自本类的子类中直接访问到。而想要在main.m文件中访问protected的实例变量,需要setter、getter方法提供在外部访问、修改实例变量的功能,接下来在.m文件中要先重写系统提供的初始化方法(重写父类的初始化方式,只能给实例变量设置默认值,不能在创建对象的过程中动态赋值。)来定制自己需要的实例变量的值!如:

- (instancetype)init{

_name = @"张三"; // _name的可见度是默认的、受保护的可见度(protected),在类的内部可以直接访问。

return self;//self总是代表当前方法的调用者,谁在调用该方法,self就代表谁。如果self出现在实例方法中,self就代表调用该方法的对象;如果出现在类方法中,就代表调用该方法的类本身。

}

接下来进行setter,getter方法的实现

// 实现name的赋值方法

- (void)setName:(NSString *)name{

_name = name;

}

// 实现name的取值方法

- (NSString *)name{

return _name;

}

在main.m中访问实例变量

// 创建一个person对象

Person *person1 = [[Person alloc] init];// 使用了 重写系统初始化方法 ,此时name是张三

person1->_age = 23; // 因为_age是@public修饰的可见度,所以可以在这里访问到

NSLog(@"%@", [person1 name]);

若需要同时修改多个实例变量,要在.h和.m文件中实现一个方法,包含三个实例变量的参数,可提供修改

// 实现一个方法,包含三个参数,但是要修改的话要同时修改,因此不常用,而要分开。

- (void)setWithName: (NSString *)name gender: (NSString *)gender age: (int)age{

_name = name;

_gender = gender;

_age = age;

}

再在main.m中由对象person1调用setWithName方法,也即setWithName向对象发送消息,这是一个消息发送机制。(消息发送者:程序员)。

[person1 setWithName: @"周润发" gender:@"男" age: 55];

NSLog(@"%@", [person1 name]);

若要一次只修改一个实例变量,则要在main.m中调用类的实例变量进行复制修改

// 调用Person类的name实例变量的赋值方法,修改姓名

[person1 setName:@"刘德华"];

NSLog(@"%@", [person1 name]);

// 调用Person的gender实例变量的赋值方法,修改性别

[person1 setGender:@"女"];

NSLog(@"%@", [person1 gender]);

在继承自Person类的子类Man类中要在实例变量中添加_address和_hobby,因为都是@proteced修饰的,仍然需要setter、getter方法提供在外部访问、修改实例变量的功能(首先需要重写系统提供的初始化方法来定制自己需要的实例变量的值!)接下来就可以在main.m中调用Man类的address和hobby的setter方法

// 调用address和hobby的setter方法赋值; 调用getter方法访问成员变量的值

Man *man1 = [[Man alloc] init];

[man1 setAddress:@"兰州市"];

NSLog(@"%@",[man1 address]);

[man1 setHobby:@"吃饭睡觉打豆豆"];

NSLog(@"%@",[man1 hobby]);

在继承自NSObject类的子类Car类中学习到了一种方法,调用Car类的调用自定义初始化方法,在初始化过程的同时给实例变量 动态赋值。其中在.h文件中定义了新的实例变量以后,学习到了用到了一种重要的自定义初始化方法,要注意:自定义的初始化方法,必须用init开头!!!!!!-(id)开头

- (id)initWithPrice: (int)price

No: (NSString *)no

Brand: (NSString *)brand;

再在.m中自定义初始化方法de实现,注意self:表示的是初始化完成的对象(main.m文件中上边赋值完成后的对象)

- (id)initWithPrice:(int)price No:(NSString *)no Brand:(NSString *)brand{

_price = price;

_No = no;

_brand = brand;

return self;

}

同样在这之后进行setter,getter实现提供在外部访问、修改实例变量的功能。

最后在main.m中调用Car类的调用自定义初始化方法,在初始化过程的同时给实例变量赋值。如果只是重写父类的初始化方式,则只能给实例变量设置默认值,不能在创建对象的过程中动态赋值。(但是两者相比,前者效率更高!!!)

Car *car1 = [[Car alloc] initWithPrice:200 No:@"陕A315970520" Brand:@"BMW"];

NSLog(@"%d", [car1 price]);

*/
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: