面向对象的三大特性
1)封装(set方法和get方法,掌握)
2)继承(掌握)
3)多态(理解概念即可)
(一)继承(一种语法):是用在类与类之间,代表(两个)类之间的关系.(OC是单继承)
1.继承的使用场合
想要获取得某个类所有成员变量和方法,要实现什么,就通过继承.
1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
2> 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类
继承的好处:
1> 抽取重复代码,提高了代码复用率
2> 建立了类之间的关系
3> 子类可以拥有父类中的所有成员变量和方法
继承的坏处:
代码的耦合性强(就是类与类之间的联系)
>注意点:基本上所有类的根类是NSObject
2.
继承要点:
1)当调用方法时,首先检测子类有没有实现这个方法,如果子类没有实现,就会调用父类的实现
2)重写:子类实现父类中声明的方法
3)子类里面声明的成员变量 和 父类里面声明的成员变量 不能同名
代码示例:
1.
#import// 抽取一个公共类@interface Animal : NSObject{ int _weight;}- (void) setWeight:(int)weight;- (int) weight;- (void)eat;@end@implementation Animal- (void) setWeight:(int)weight{ _weight = weight;}- (int) weight{ return _weight;}- (void)eat { NSLog(@"吃吃吃-体重:%d", _weight);}@end// Bird的声明// 这里是冒号 : 代表继承// Bird继承了Animal,就能拥有Animal的所有方法和成员变量// Animal是Bird的父类(超类 superclass)@interface Bird : Animal@end// Bird的实现@implementation Bird@end// Dog的声明// Dog继承了Animal,就能拥有Animal的所有方法和成员变量// Animal是Dog的父类(超类 superclass)@interface Dog : Animal@end// Dog的实现@implementation Dog@end// Bird、Dog都是Animal的子类(subclasses)int main(){ Dog *dog = [Dog new]; [dog setWeight:100]; [dog eat]; return 0;}
2.注意:
/*就近原则 重写:子类重新实现父类的某个方法,会覆盖父类以前的做法 NSProxy和NSObject isa 所有继承至NSObject对象,都有isa指针(是声明在NSObject中),指向它对应的类 *//* 1.重写:子类重新实现父类中的某个方法,覆盖父类以前的做法 2.注意 1> 父类必须声明在子类的前面 2> 子类不能拥有和父类相同的成员变量 3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找 2.坏处:耦合性太强(即类之间的关系太强,你离不开我,我离不开你,把某个类删掉后,就不能用了) */#import@interface Person : NSObject // 冒号表示继承关系,后面跟的是父类@end
l 父类\超类 superclass
l 子类 subclass\subclasses
(二)super、self使用
1.self的使用
1)
self:接受消息的对象或类,当前对象的指针 (指向 方法调用者)。 注意: 在类方法中,self一定指向类
super:接受消息的对象的父类,用于调用父类的成员方法。
出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数
2)作用
1> 使用 "self->成员变量名" 访问当前方法调用的成员变量
2> 使用 "[self 方法名];" 来调用方法(对象方法\类方法)
代码示例:
/* self 1.使用场合:只能用在方法(对象方法\类方法),不能用在函数中 2.每次调用方法的时候,系统会自动创建self指针 3.self指针指向方法调用者 */#import@interface Car : NSObject{ int _wheels;}- (void)setWheels:(int)wheels;- (int)wheels;- (void)run;@end@implementation Car// 所有的成员变量(不管是不是@public),都能直接在对象方法中访问- (void) setWheels:(int)wheels{ self->_wheels = wheels;}- (int) wheels{ return self->_wheels;}- (void) run{ // self是一个特殊的指针,只在@implementation的方法中才有 // self其实是方法中一个内置指针,每次调用方法,都会有self这个指针 // self指针指向方法调用者 int _wheels = 10; // 利用self指针访问方法调用的成员变量_wheels NSLog(@"%i个轮子的车子飞奔起来了!", self->_wheels);}/* 错误写法:self不能用在函数中void test(){ self->_wheels = 10;} */@endint main(){ Car *c = [Car new]; [c setWheels:4]; [c run]; return 0;}
2.super的使用
作用
1)直接调用父类中的某个方法。
2)super处在对象方法中,那么就会调用父类的对象方法。
super处在类方法中,那么就会调用父类的类方法。
3)使用场合:子类重写父类的方法时想保留父类的一些行为。
思想:对于一些相同的属性,一般抽取一个公共类。