------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
继承
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增
加新的数据或新的功能。一般都是使用“:”来实现继承。
① 实例变量的继承
在父类中声明的实例变量可以在子类中使用,子类中就可以不再对该变量进
行声明,这样子类继承的父类的实例变量就变成了自己类中的实例变量。子类不仅可以继承父类的实例变量,还可以拥有自己特有的实例变量。
② 方法的继承
除了实例变量可以继承外,方法也是可以被继承的。父类中定义的方法在子
类中也可以直接被访问,不需要在子类中重新定义。子类不仅可以继承父类的方法,还可以有自己独特的方法。
Person.h
<pre name="code" class="html">#import <Foundation/Foundation.h>
@interface Person : NSObject{ //person类的申明继承NSObject @protected NSString *_nation;} #pragma mark - 属性#pragma mark 姓名@property (nonatomic,copy) NSString *name;#pragma mark 年龄@property (nonatomic,assign) int age;#pragma mark 籍贯@property (nonatomic,copy) NSString *nation;//带有参数的构造函数-(id)initWithName:(NSString *)name andAge:(int )age;//通过静态方法返回一个对象+(id)personWithName:(NSString *)name andAge:(int )age; @end
Person.m
#import "Person.h"
@implementation Person //person类的实现
//带有参数的构造函数
-(id)initWithName:(NSString *)name andAge:(int)age{
if(self=[super init]){ //super代表父类
self.name=name;
self.age=age;
}
return self;
}
//通过静态方法返回一个对象
+(id)personWithName:(NSString *)name andAge:(int)age{
Person *p=[[Person alloc]initWithName:name andAge:age];
return p;
}
// 重写description
-(NSString *)description{
return [NSStringstringWithFormat:@"{name:%@,age:%i}" ,self.name,self.age];
}
@end
Student.h
#import "Person.h"
@interface Student : Person //student类的申明,继承与person类
@property (nonatomic,assign) float score;
//带有参数的构造函数
-(id)initWithName:(NSString *)name andAge:(int )age andScore:(float)score;
//通过静态方法返回一个对象
+(id)studentWithName:(NSString *)name andAge:(int )age andScore:(float)score;
@end
Student.m
#import "Student.h" //student类的实现
@implementation Student
// 带有参数的构造函数
-(id)initWithName:(NSString *)name andAge:(int )age andScore:(float)score{
if(self=[super initWithName:name andAge:age]){
self.score=score;
}
return self;
}
+(id)studentWithName:(NSString *)name andAge:(int)age andScore:(float)score{//</span><span style="font-family: SimSun; font-size: 18px;">通过静态方法返回一个对象</span><span style="font-family:SimSun;font-size:18px;">
Student *s=[[Student alloc]initWithName:name andAge: ageandScore: score];
return s;
}
-(NSString *)description{ //方法的重写
return [NSString stringWithFormat:@"{name:%@,age:%i,nation:%@,scroe:%.2f}",self.name,self.age,self->_nation,self.score]; //注意这里访问了父类的属性和方法
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
Person *p=[Person personWithName:@"Kenshin" andAge:28];
NSLog(@"p=%@",p);
Student *s=[Student studentWithName:@"Kaoru" andAge:27 andScore:100];
s.nation=@"henan";
NSLog(@"s=%@",s);
return 0;
}
总结:
继承是面向对象三大特征(继承、封装、多态)之一。
子类可以继承父类的所有实例变量与方法,但不一定都能使用,如用@private修饰的实例变量和私有方法就不能被子类调用。私有方法不用申明,只需要实现,其只在本文件中有效。