——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
1、面向对象三大特征
OC中面向对象的三大特征是:封装、继承和多态。
2、封装
封装就是把数据隐藏起来,只能用此类的方法函数才可以访问或者设置数据,不能被外部任意存储,从而降低了数据被无用的可能性。
在OC语言中,使用@interface和@implementation来处理类。@interface就像是暴露在外面的接口,@implementation就是类的具体实现。
(1)封装的原理
实力变量默认只能被当前类的对象方法访问。
(2)封装的步骤
定义设置实例变量(setter)和访问实例变量(getter)的方法
1)setter方法(设置器)
在开发中,考虑到安全问题,我们一般不在成员变量前面使用@public、@protected等关键字修饰,而是使用Set方法来为对象提供实例变量的值,在Set方法的内部也可以对一些不合理的赋值进行筛选过滤。
Set方法的作用:为外界提供了一个设置成员变量值的方法
Set方法的命名规范:
1–方法必须以set开头
2–返回值必须是void类型
3–必须有一个参数,而且参数的类型和成员变量的类型一致
4–set后面跟上成员变量名去掉下划线的名称,首字母大写
5–形参名不能和成员变量名一样(苹果官方推荐成员变量名以_开头以示区分)
6–set方法一定是一个对象方法
2)getter方法(访问器)
Get方法的作用是为调用者返回对象内部的实例变量
Get方法的命名规范:
1–一定有返回值,并且返回值类型和成员变量的类型一致
2–方法名是成员变量名去掉_
3–不需要接受任何参数
例:
#import <Foundation/Foundation.h>
@interface Person:NSObject{
int _num;
NSString *_name;
int _age;
}
-(void)setNum:(int)num;//定义一个set方法
-(void)setName:(NSString *)name;//定义一个set方法
-(void)setAge:(int)age;//定义一个set方法
-(int)num;//定义num的get方法
-(NSString *)name;//定义name的get方法
-(int)age;//定义age的get方法
@end
@implementation Person
-(void)setNum:(int)num{ //setNum的实现
_num=num;
}
-(void)setName:(NSString *)name{ //setName的实现
_name=name;
}
-(void)setAge:(int)age{ //setAge的实现
_age=age;
}
-(int)num{ //num的get方法实现
return _num;
}
-(NSString *)name{ //name的get方法实现
return _name;
}
-(int)age{ //age的get方法实现
return _age;
}
@end
int main(){
Person *p=[Person new];
[p setNum:201102105101];
NSLog("%d",[p num]);
[p setName:@"张三"];
NSLog("%@",[p name]);
[p setAge:18];
NSLog("%d",[p age]);
}
3、继承
所谓继承,必然要有父和子之间的关系,通过某种联系,子能继承父亲的一些特性。
OC中我们也称父类是基类,子类是派生类。
例:
基类Animal类可以派生出Dog类、Cat类,Dog类又可以派生出JunDog类、BigYellowDog类,Cat类可以派生出BigLianCat类。
继承的代码实现:
1)导入要继承的那个父类的头文件(.h文件)
2)@interface 子类:父类
例:
#import "Animal.h" //导入父类(Animal)的头文件
@interface Dog:Animal //子类Dog继承父类Animal
@end
一个完整的继承和实现的代码如下:
//子类部分
#import "Animal.h"
@interface Dog:Animal
-(void)jiao; //Dog独有的jiao方法
-(void)eat:(NSString *)foodName; //重写的父类的eat方法
@end
@implementation Dog //Dog类的方法的实现
-(void)jiao{
NSLog("狗大叫3声!");
]
-(void)eat:(NSString *)foodName{
NSLog("狗在大口吃%@",foodName);
}
@end
//父类部分
@interface Animal:NSObject //NSObject类是任何类的父类
-(void)test; //父类的test方法
-(void)eat:(NSString *)foodName; //父类的eat方法
@end
@implementation Dog //父类方法的实现
-(void)test{
NSLog("这只是个测试!");
]
-(void)eat:(NSString *)foodName{
NSLog("动物在大口吃%@",foodName);
}
@end
//main函数
int main(){
Animal *ani=[Animal new];
[ani test]; //调用自身的test方法
[ani eat:@"肉"]; //调用自身的eat方法
Dog *d=[Dog new];
[d test]; //调用从父类继承的方法
[d eat:@"肉"]; //调用Dog自身重写的eat方法
}
运行后我们会发现,子类Dog能从父类Animal继承方法,而且自己也能对父类的方法进行重写,从而能完成特有的功能
继承的注意事项:
1–子类不能定义和父类同名的成员变量,但是可以继承父类的变量
2–OC中只支持单一继承,不支持多继承
3–OC类支持多层继承,所谓多层继承就是子类能继承父类,父类还能继承另外一个类
4–基类的私有属性能被继承,不能被使用
6–重写方法就是父类的某些方法在子类中不适合,因此在子类中定义一个和父类这个方法一样的名字,但是对实现部分进行了重新编写,以满足自身的要求
继承中方法调用的顺序:
1–现在自己类中寻找
2–如果自身没有,就去父类中寻找
3–如果父类也没有,就去父类的父类中寻找
4–以此向上级寻找,直到找到NSObject类
5–如果NSObject类中也没有,系统就报错了
4、多态
(1)什么是多态
多态就是某一类事物的多种形态。
程序中的多态,不同的对象以自己的方式响应相同名称方法的能力成为多态。
(2)多态的条件
1–有继承关系,有方法的重写
2–父类的声明变量指向子类的对象
例:
Animal *ani=[Dog new];//父类Animal定义对象ani指向Dog
多态的优点:
1–简化了编程接口,容许在类和类之间重用一些习惯性的命名。
2–多态使得代码可以分散在不同的对象中而不再试图在一个啊和你熟中考虑到所有可能的对象
(3)多态的注意点
1–如果存在多态,子类可以访问子类特有的方法
2–如果不存在多态,父类不可以访问子类特有的方法
多态的代码实现举例:
#import "Animal.h"
#import <Foundation/Foundation.h>
@interface Dog:Animal
-(void)run;
-(void)eat:(NSString *)foodName;
@end
@implementation Dog
-(void)run{
NSLog("狗会跑!");
}
-(void)eat:(NSString *)foodName{
NSLog("狗吃%@",foodName);
}
@end
int main(){
Animal *ani=[Dog new];//定义多态
[ani run]; //调用狗的run方法
[ani eat:@"肉"];//调用狗的eat方法
}