Object-C——三大特性之封装
面向对象中,程序的三大特性分别为:封装、继承和多态
一、封装
为了保护类的变量被外界随意访问,我们对类进行封装,使用特定的方法对封装的类中的成员进行访问。
封装的好处:
- 过滤不合理的值
- 屏蔽内部的赋值过程
- 让外界不必关注内部的细节
(一)、 set方法
1、作用: 提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤
2、命名规范:
① 方法名必须以set开头
② set后面跟上成员变量的名称,成员变量的首字母必须大写
③ 返回值一定是void
④ 一定要接收一个参数,而且参数类型跟成员变量类型一致
⑤ 形参的名称不能跟成员变量名一样
1 #import <Foundation/Foundation.h> 2 3 @interface Student : NSObject 4 { 5 //去掉@public 6 7 int age; 8 } 9 - (void)setAge:(int)newAge; 10 @end 11 @implementation Student 12 13 // set方法的实现 14 - (void)setAge:(int)newAge 15 { 16 // 对传进来的参数进行过滤 17 if (newAge <= 0) 18 { 19 newAge = 1; 20 } 21 22 age = newAge; 23 } 24 25 - (int)age 26 { 27 return age; 28 }
(二)get方法
1、作用:返回对象内部的成员变量
2、命名规范:
① 肯定有返回值,返回值类型肯定与成员变量类型一致
② 方法名跟成员变量名一样
③ 不需要接收任何参数
1 #import <Foundation/Foundation.h> 2 // 声明 3 @interface Car : NSObject 4 { 5 int _wheels; // 轮子个数 6 } 7 /*get方法*/ 8 - (int) wheels; 9 @end 10 11 @implementation Car 12 // get方法的实现 13 - (int) wheels 14 { 15 return _wheels; 16 } 17 @end
(三)类方法
直接可以用类名来执行的方法
1、对象方法
① 减号 - 开头
② 只能由对象来调用
③ 对象方法中能访问当前对象的成员变量(实例变量)
2、类方法
① 加号 + 开头
② 只能由类(名)来调用
③ 类方法中不能访问成员变量(实例变量)
3、类方法的好处和使用场合
① 不依赖于对象,执行效率高
② 能用类方法,尽量用类方法
③ 场合:当方法内部不需要使用到成员变量时,就可以改为类方法
4、可以允许类方法和对象方法同名
5、代码举例
1 @interface Person : NSObject 2 { 3 int age; 4 } 5 6 // 类方法都是以+开头 7 + (void)printClassName; 8 9 - (void)test; 10 + (void)test; 11 12 @end 13 14 @implementation Person 15 16 + (void)printClassName 17 { 18 19 // 实例变量age不能在类方法中访问 20 21 } 22 23 - (void)test 24 { 25 NSLog(@"111-%d", age); 26 27 //[Person test]; 28 } 29 30 + (void)test 31 { 32 33 34 NSLog(@"333"); 35 36 } 37 38 @end
(四)self关键字
1、self的用途:
① 谁调用了当前方法,self就代表谁
* self出现在对象方法中,self就代表对象
* self出现在类方法中,self就代表类
② 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量
③ [self 方法名]可以调用其他对象方法\类方法
1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 { 5 int _age; 6 } 7 8 - (void)setAge:(int)age; 9 - (int)age; 10 11 - (void)test; 12 13 @end 14 15 @implementation Person 16 - (void)setAge:(int)age 17 { 18 // _age = age; 19 self->_age = age; 20 } 21 - (int)age 22 { 23 return self->_age; 24 } 25 26 - (void)test 27 { 28 // self:指向了方向调用者,代表着当期对象 29 int _age = 20; 30 NSLog(@"Person的年龄是%d岁", self->_age); 31 } 32 33 @end
2、self关键字使用注意
防止出现死循环现象,代码举例如下:
1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 - (void)test; 5 + (void)test; 6 @end 7 8 @implementation Person 9 - (void)test 10 { 11 NSLog(@"调用了-test方法"); 12 13 // 会引发死循环 14 //[self test]; 15 } 16 17 + (void)test 18 { 19 NSLog(@"调用了+test方法"); 20 21 // 会引发死循环 22 //[self test]; 23 } 24 @end