继承的本质是子类将父类所有的成员变量和方法原封不动的拷贝到自己的.h和.m文件中。
在继承后,在main.m文件的头文件里引入类文件时,只需要引入子类,不需要将父类引入,因为已经在子类中引入过父类了,不需要再次引入。(注意:import关键字是将文件拷贝进来,但是import有重复引入检测的功能,不会导致重复引入错误,但是include没有检测功能,所以在.h文件中使用条件编译命令做防止策略)
如:student类继承自person类,但是在main.m文件只引入了#import student
#import <Foundation/Foundation.h>
#import "Student.h" // 此处没有引入person.h是因为i=student类已经引入了,并不是因为继承的关系
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 创建学生对象
Student *stu = [[Student alloc] init];
// 创建person对象
Person *person = [[Person alloc] init];
stu._age = 23;
stu._name = @"zhangsan";
// 使用person类的方法
[person sayHi];
[person study];
[stu setID:11111];
[stu sayHi];
[stu study];
NSLog(@"name = %@, age = %i, ID = %i", stu._name, stu._age, stu.getID);
}
return 0;
}
2.子类重写父类的方法实现
在子类中重写弗雷德方法时,不需要再取.h文件中声明该方法,因为已经在父类中声明过了,直接再.m中重写方法实现就行。
如:在student.m文件中,因为已经在person类中声明了sayhi方法,要在student类中重写该方法:
// 重写父类的打招呼方法,不需要再.h文件中声明
- (void)sayHi
{
NSLog(@"laoshihao");
}
3.self与super关键字
self关键字和super关键字
self关键字的作用是调用自身的方法和属性,始终代表调用方法的对象
super关键字的作用是调用父类中的方法
- (void)sayHi
{
[super sayHi]; // 向父类发送sayhi消息,去父类中查找父类的syahi方法(实质是去调用从父类继承过来的方法)
[self sayHi]; // 向自己发送sayhi消息,去自己那里查找sayhi方法(实质是调用子类自己的方法)(切忌:不能在自己重写的方法中调用自己,会形成死循环,如该形式。)
NSLog(@"laoshihao");
}
4.自定义初始化方法
声明部分
- (id)initWithName:(NSString *)name
gender:(NSString *)gender;
实现部分
// 自定义初始化方法的实现
- (id)initWithName:(NSString *)name gender:(NSString *)gender
{
_name = name;
_gender = gender;
return self;
}
上边代码中的(id)返回值类型也可以写成( instancetype)区别是:
// id和instancetype都可以作为方法返回值类型,但区别是:id可以做为参数的类型,但instancetype只能作为返回值类型
自定义初始化方法的完整实现
// 自定义初始化方法的完整实现
- (id)initWithName:(NSString *)name gender:(NSString *)gender
{
self = [super init]; // 调用父类(nsobject)的init方法进行初始化
if (self) { // 判断初始化是否成功,成功则不为nil,进入附值
_name = name;
_gender = gender;
}
return self;
}
重写子类的初始化方法,如果子类有大量的实例变量是继承自父类,则在初始化是可以不用再此附值,使用super关键字即可调用父类的初始化方法
如:student继承自person,_name和_gender变量已经在person中初始化过了,所以不需要再初始化这两个变量
// 实现重写的学生初始化方法
- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender :(int)ID className:(NSString *)className
{
// _name = name;
// _gender = gender;
if (self = [super initWithName:_name gender:_gender]) {
_ID = ID;
_className = className;}
return self;
}
自定义初始化方法的完整实现(三步走):
// 自定义初始化方法的完整实现
- (id)initWithName:(NSString *)name gender:(NSString *)gender
{
self = [super init]; // 1.调用父类(nsobject)的init方法进行初始化
if (self) { // 2.判断初始化是否成功,成功则不为nil,进入附值
_name = name; // 3.给本类特有的实例变量附值
_gender = gender;
}
return self; // 返回
}