继承、初始化方法、便利构造器
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject{
NSString *_name; //姓名
int _age; //年龄
NSString *_sex; //性别
}
//自定义声明一个只用名字的初始化方法
-(instancetype)initWithName:(NSString *)name;
//声明一个对所有成员变量赋值的初始化方法
-(instancetype)initWithName:(NSString *)name
Age:(int)age
Sex:(NSString *)sex;
//声明一个便利构造器方法
+(instancetype)personWithName:(NSString *)name;
//设置器 声明setter方法
-(void)setName:(NSString *)name;
//声明getter方法
-(NSString *)name;
@end
Person.m
#import "Person.h"
@implementation Person
//实现自定义一个成员变量
-(instancetype)initWithName:(NSString *)name {
// 调用一下父类的init初始化方法的实现,把 实现结果继承过来;
self = [super init];///
if (self) {
// 如果初始化成功就对实例变量赋值
_name = name;
}
NSLog(@"self = %@",self);
return self;
}
//实现便利构造器方法
+(instancetype)personWithName:(NSString *)name{
// self在+方法(即类方法)中是类的名字,而不是一个指针
Person *p = [[Person alloc] initWithName:name];
NSLog(@"+ self = %@", self);
return p;
}
//实现一个对所有成员变量赋值的初始化方法
-(instancetype)initWithName:(NSString *)name
Age:(int)age
Sex:(NSString *)sex{
self = [super init];
if (self) {
_name = name;
_age = age;
_sex = sex;
}
return self;
}
//实现setter方法
-(void)setName:(NSString *)name{
_name = name;
}
//实现getter方法
-(NSString *)name{
return _name;
}
@end
Student.h
#import "Person.h"
@interface Student : Person{
@private
float _score;
// NSString *_name; _name 是从父类中继承的。不能在子类中重新声明
NSString *_school; //学校
NSString *_number; //学号
}
//声明了一个自定义的初始化方法
-(instancetype)initWithSchool:(NSString *)school
andNumber:(NSString *)number;
//声明一个输出方法
-(void)print;
//
-(void) setAge:(int)age;
//声明一个学习方法
-(void)study;
@end
Student.m
#import "Student.h"
@implementation Student
//实现了一个自定义的初始化方法
-(instancetype)initWithSchool:(NSString *)school
andNumber:(NSString *)number{
self = [super init];
if (self) {
_school = school;
_number = number;
}
return self;
}
//实现输出
-(void)print {
NSLog(@"My name ix %@",_name);
}
//实现setter设置器
-(void) setAge:(int)age {
_age = age;
}
//实现学习方法
-(void)study{
}
@end
CollegeStudent.h
#import "Student.h"
@interface CollegeStudent : Student{
NSString *_major; //专业
NSString *_academy; //学院
}
@end
CollegeStudent.m
#import "CollegeStudent.h"
@implementation CollegeStudent
-(void)print{
[super setName:@"wewew"];
NSLog(@"_name = %@", _name);
// super是编译器指令,不是一个对象;
[super print];
NSLog(@"我只在.m中实现了。");
}
//重写:子类对父类方法进行重新实现;不用在.h中进行声明;在调用时执行的是子类中重新实现的方法
-(id)init{
// _score = 20; 类的私有实例变量也会被子类继承,但是不能使用
return self;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "CollegeStudent.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
// 大学生这个类创建对象使用的是NSobject类里面的方法;即CollageStudent同时具有NSObject和Student类的属性和行为
CollegeStudent *collStudent = [[CollegeStudent alloc]init];
// [collStudent print];
Student *student = [[Student alloc] init];
// 通过setter和getter来设置和访问成员变量
[student setName:@"zhangdan"];
NSLog(@"name = %@",[student name]);
[student print];
// 1、在collegeStudent这个类中查找study,如果找到就直接执行,如果找不到就去他的父类中查找
// 2、一直查到NSObject中,如果NSObject中没有这个方法,程序就直接崩溃
[collStudent study];
[collStudent print];
// 创建一个Person对象,用自定义的初始化方法
Person *p1 = [[Person alloc] initWithName:@"wangwu"];
NSLog(@"p1 = %p",p1);//p1 = 0x1001064e0
NSLog(@"p1 = %@",p1);//p1 = <Person: 0x1001064e0>
// 创建一个student对象
Student *stu = [[Student alloc] initWithSchool:@"qinghua" andNumber:@"232323"];
// 创建一个人类对象
Person *p2 = [Person personWithName:@"zhaoli"];
NSLog(@"p2 = %@",p2);
return 0;
}