OC第三天-继承,初始化方法,便利构造器 ,self,super,方法重写

继承、初始化方法、便利构造器
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值