面向对象的三大特性:封装(成员变量)、继承、多态;
一、 封装
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方法使用示例:
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
//@public
//成员变量保证安全性不要用public
int _age; // 年龄
int _num; // 学号
}
/* set方法声明 */
- (void)setAge:(int)age;
/* get方法声明 */
- (int)age;
@end
@implementation Student
/* set 方法实现 */
- (void)setAge:(int)age
{
// 对参数进行过滤
if (age <= 0)
{
age = 1;
}
_age = age;
}
/* get 方法实现 */
- (int)age
{
// 返回成员变量的值
return _age;
}
@end
int main()
{
Student *stu = [Student new];
[stu setAge:-12];
NSLog(@"学生的年龄是%d岁",[stu age]);
return 0;
}
运行结果:
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)类方法使用陷阱--小心死循环
+(void)test
{
[person test];
}
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;
}