…………………………………………………………………………………………………………………………………………………………….
//继承:子类会继承父类所有实例变量以及方法
//self: 谁调用此方法,self就是谁。
// self: 调用方法,首先在当前类寻找实现,如果有实现,直接调用,如果没有,去父类中寻找实现,找到即执行完毕。
//super 是编译器指令,不是对象。
// super调用方法,直接去父类中寻找实现,执行完父类的实现,再执行子类的实现,完毕。
//指定初始化方法:
// 一定会调用父类的指定初始化方法
// 一般来说参数最多
//便利构造器
// 内部实现即调用了指定初始化方法。
// main.m
#import<Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
#import "Car.h"
#import "AudiCar.h"
#import "CollegeStudent.h"
int main(intargc, const char * argv[]) {
@autoreleasepool {
// Person *person = [[Person alloc]initWithName:@"ylc"gender:@"m" age:20];
// [personsetName:@"zrt" gender:@"w" age:21];
// [personsayHi];
//
// Student *stu = [[Student alloc]initWithName:@"ee"gender:@"m" age:100 num:2];
// [stusetName:@"sds" gender:@"fs" age:22];
// // 如果当前类有重新实现,就是用当前类的重新实现方法,如果没有重新实现,使用父类的方法
// [stusayHi];
CollegeStudent *collegestudent =[[CollegeStudentalloc]initWithName:@"yzz" gender:@"m"age:22 num:1 major:@"electricity"];
// 向college发送sayHi消息
[collegestudentsayHi];
// 利用便利构造器发送一个消息
// 便利构造器是一个 + 方法,因此用类名调用
// 返回值类型为 Person *,因此用 Person * 型变量接受。
Person *p = [Person personWithName:@"df" gender:@"f"age:33];
}
return 0;
}
// Person.m
#import "Person.h"
@implementation Person
// 指定初始化方法: 一般参数最多,而且会调用父类的初始化方法。
- (instancetype)initWithName:(NSString*)name gender:(NSString *)gender age:(int)age{
self = [super init];
if (self) {
// _name = name;
// _gender = gender;
// _age = age;
[selfsetName:namegender:genderage:age];
}
return self;
}
- (void)setName:(NSString *)namegender:(NSString *)gender age:(int)age{
_name = name;
_gender = gender;
_age = age;
}
- (NSString *)name{
return _name;
}
- (int)age{
return _age;
}
- (NSString *)gender{
return _gender;
}
- (void)sayHi{
NSLog(@"%@正在唱小苹果",_name);
}
// 便利构造器的实现
+ (Person *)personWithName:(NSString *)namegender:(NSString *)gender age:(int)age{
Person *p = [[Person alloc]initWithName:namegender:genderage:age];
return p;
}
@end
// Student.m
#import "Student.h"
@implementation Student
- (instancetype)initWithName:(NSString*)name gender:(NSString *)gender age:(int)age num:(int)num{
// _name = name;
// _gender = gender;
// _age = age;
// _num = num;
//调用父类的初始化方法
self = [super initWithName:namegender:genderage:age];
if (self) {
_num = num;
}
return self;
}
- (void)sayHi{
// 这里不能向self发送sayHi消息,会造成递归调用。
//向父类发送sayHi消息,super不是一个对象。
[supersayHi];
NSLog(@"%@唱最炫民族风",_name);
}
@end
// CollegeStudent.m
#import "CollegeStudent.h"
@implementationCollegeStudent
- (instancetype)initWithName:(NSString*)name gender:(NSString *)gender age:(int)age num:(int)num major:(NSString*)major{
// _name = name;
// _gender = gender;
// _age = age;
// _num = num;
// _major = major;
self = [superinitWithName:namegender:genderage:agenum:num];
if (self) {
_major = major;
}
return self;
}
- (void)setMajor:(NSString *)major{
_major = major;
}
- (NSString *)major{
return _major;
}
//子类可以重写⽗类的方法,即:子类既有⾃己的实现,⼜有⽗类继承下来的实现,如果想使用⽗类的实现,向super发送消息。
- (void)sayHi{
[supersayHi];
NSLog(@"123");
}
@end