面向对象(类的继承)
继承的特点
当子类扩展父类时,子类可以继承得到父类的全部成员变量和全部方法(包括初始化方法)。
重写父类方法
方法的重写必须注意方法签名关键字要完全相同,也就是方法名和方法签名中的形参标签都需要完全相同,否则就不能算方法重写。
super关键字
super
即可出现在类方法中,也可出现在实例方法中。在类方法中使用super
调用父类的方法时,被调用的父类方法只能是类方法;在实例方法中使用super
调用父类方法时,被调用的父类方法只能是实例方法。
当子类继承父类时,子类可以获得父类中定义的成员变量,因此,子类接口部分不允许定义与父类接口部分重名的成员变量。
在类的实现部分定义的成员变量将被限制在该类的内部,因此,父类在类实现部分定义的成员变量对子类没有任何影响。无论是接口部分还是实现部分,子类定义的成员变量都可以与父类实现部分定义的成员变量同名。
当子类实现部分定义了与父类重名的成员变量时,子类的成员变量就会隐藏父类的成员变量。此时可通过调用父类的方法来访问父类中被隐藏的成员变量。
例:
JSParend.h
#import <Foundation/Foundation.h>
@interface JSParent : NSObject{
int _a;
}
@property (nonatomic , assign) int a;
@end
JSParend.m
#import <Foundation/Foundation.h>
#import "JSParent.h"
@implementation JSParent
- (id) init{
if(self = [super init]){
self->_a = 5;
}
return self;
}
@end
JSSub.h
#import <Foundation/Foundation.h>
#import "JSParent.h"
@interface JSSub:JSParent
- (void) accessOwner;
@end
JSSub.m
#import <Foundation/Foundation.h>
#import "JSSub.h"
@implementation JSSub{
//该成员变量将会隐藏父类的成员变量
int _a;
}
- (id) init{
if(self = [super init]){
self->_a = 7;
}
return self;
}
- (void) accessOwner{
//直接访问的是当前类中的成员变量
NSLog(@"子类中_a成员变量: %d",_a);
//访问父类中被隐藏的成员变量
NSLog(@"父类中被隐藏的_a成员变量: %d", super.a);
}
@end