面向对象的三大特性:封装(成员变量)、继承、多态;
一、 封装
1. 封装的理解:
在开发过程中,考虑到安全性要求,我们通常不让外界直接修改我们类的成员变量,而让外界使用我们提供的方法来修改,这样类 的成员变量就 封装起来了。
2. 封装的目的就是:保证数据的安全行,保证业务逻辑正常 运行。
二、set 方法和get 方法
@public的成员可以被随意赋值,为了封装成员变量OC中使用set方法和get方法来管理成员的访问。
1. set方法
1) 作用:提供一个方法给外界设置成员变量属性值,可在方法里面对一些不合理的赋值进行筛选和过滤。
2) 命名规范
1> 方法命名必须以set开头
2> set后面跟上成员变量的名称。成员变量的首字母必须大写。
3> 返回值一定是void
4> 一定要接受一个参数,而且参数的类型一定要和成员变量的类型一致
5>行参名称不能跟成员变量名一样,苹果官方规定成员变量的命名以 _开头
3) set方法好处:
1> 不让数据暴露在外,保证了数据的安全性
2> 对设置的数据进行过滤
2. get方法
1) get方法的作用:为调用者返回对象内部的成员变量
2) 命名规范:
(1)一定有返回值,返回值的类型和成员变量的类型一致
(2)方法名和成员变量名一样
(3)不需要接收任何参数
3.成员变量的命名规范
➢成员变量都以下划线 _ 开头
➢可以跟get方法的名称区分开
➢可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量
4. 不一定set和get方法都会提供,如果内部的成员变量只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set 方法。
5. set方法和get方法使用示例:
1 #import <Foundation/Foundation.h> 2 3 @interface Student : NSObject 4 { 5 //@public 6 //成员变量保证安全性不要用public 7 int _age; // 年龄 8 int _num; // 学号 9 } 10 11 /* set方法声明 */ 12 - (void)setAge:(int)age; 13 14 /* get方法声明 */ 15 - (int)age; 16 @end 17 18 @implementation Student 19 20 /* set 方法实现 */ 21 - (void)setAge:(int)age 22 { 23 // 对参数进行过滤 24 if (age <= 0) 25 { 26 age = 1; 27 } 28 _age = age; 29 30 } 31 /* get 方法实现 */ 32 - (int)age 33 { 34 // 返回成员变量的值 35 return _age; 36 } 37 @end 38 39 int main() 40 { 41 Student *stu = [Student new]; 42 [stu setAge:-12]; 43 NSLog(@"学生的年龄是%d岁",[stu age]); 44 return 0; 45 }
运行结果:
2015-03-16 22:44:39.247 a.out[1798:164370] 学生的年龄是1岁
三、方法与函数的区别
1) OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
2) C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
3) C函数不能访问OC对象的成员
四、类方法与对象方法
1. 方法名注意
> 冒号也是方法名的一部分
> 同一个类中不允许两个对象方法同名
2. 方法的调用
OC中执行一些行为就加[]具体如下:
[stu setAge:-12]; //调用 stu 对象的setAage方法并传入了参数-12 ,实际意义是向stu 这个对象发送了一个消息
3. OC中的两种方法:类方法和对象方法
什么是类方法:直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类对象方法的列表
什么是对象方法:直接可以用对象来执行的方法(
1) 对象方法
➢以减号-开头
➢只能由对象调用,没有对象,这个方法根本不可能被执行
➢对象方法能访问实例变量(成员变量)
2) 类方法
➢以加号+开头
➢只能用类名调用,对象不能调用,不用创建对象
➢类方法中不能访问实例变量(成员变量)
➢使用场合:当方法内部不需要使用到成员变量时,就可以改为类方法,一般没有成员的变量的类(工具类:没有任何成员变量,里面的方法都是类方法,如计算器)
3)类方法和对象方法可以同名,对象方法中能够调用类方法,类方法中也可以调用对象方法
4) 类方法使用的好处:
不依赖对象,执行效率高,能用类方法就尽量用类方法
5)类方法使用陷阱--小心死循环
1 +(void)test 2 { 3 [person test]; 4 }
4. 类方法与对象方法示例
#import <Foundation/Foundation.h> @interface Person : NSObject //类方法都是以+开头 + (void)printClassName; //对象方法都是以-开头 - (void)test; @end @implementation Person /* 类方法实现 */ + (void)printClassName { NSLog(@"Person"); } /* 对象方法实现 */ - (void)test { NSLog(@"This is test function"); } @end int main() { //运行时类加载到内存,里面有方法列表,直接去 类列表地址中找加号开头的方法 //不用创建对象 [Person printClassName]; Person *p = [Person new]; // 对象方法调用 [p test]; return 0; }