OC 第三讲 继承初始化方法

在我们生活中,有很多的继承关系,其实继承我们可以理解为它是什么什么的一种。比如:汽车是交通工具的一类,也就是汽车类继承于交通工具类。

继承的上层:父类:superclass;

继承的下层:子类:subclass;

是单向的,不能相互继承,具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为。 A是子类, B是父类

例:父类 Person

#impor<Foundation/Fundation.h>

@interface Person : NSObject {

NSString *_name;

NSString *_sex;

NSInteger _age;

}

@end


例:子类 Student

# import<Person.h>

@interface Student : Person {

// 学生特有的成员变量

NSString *_school;

NSInteger _number;

}

oc中 只允许单继承; 没有父类的类称为根类;oc中的根类是NSObject;

继承的内容:所有的成员变量和方法;也可以重写父类的方法:

super 的用法: 

super 是编译器指令,在方法实现的内部使用;

作用:给super 发送消息,可以执行从父类继承下来的方法。


继承中的初始化方法:

self = [super init];

初始化过程:  1.执行父类中实现的初始化方法。

        2.从根类NSObject开始执行初始化方法。

3.判断父类中的初始化是否成功,就是判断self是否存在。

4.若存在初始化子类成员变量

5.完成对象的初始化设置,返回对象。


例:建立一个Person类,在建立Student类继承于Person,建立UniversityStudent类继承于Student;

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject {

   NSString *_name;

    NSString *_sex;

    NSInteger _age;

@private

    float _money;

}

///  指定(指派)初始化

- (id)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age;


///  其他自定义初始化方法

- (id)initWithSex:(NSString *)sex;

- (id)initWithName:(NSString *)name age:(NSInteger)age;

- (id)initWithName:(NSString *)name sex:(NSString *)sex;


- (void)sayHi;

@end


Person.m

#import "Person.h"


@implementation Person


///  自定义初始化

- (id)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age

{

    NSLog(@"Person类初始化开始");

    self = [super init];    //父类是NSObject, init!

    if (self) {

        _name = name;

        _sex = sex;

        _age = age;

    }

    NSLog(@"%@", self);

    NSLog(@"Person类初始化结束");

    return self;

}


///  其他自定义初始化方法 ,需要调用上面的指派初始化方法

- (id)initWithSex:(NSString *)sex

{

    self = [self initWithName:nil sex:sex age:0];

    return self;

}


- (id)initWithName:(NSString *)name age:(NSInteger)age

{

    self = [self initWithName:name sex:nil age:age];

    return self;

}


- (id)initWithName:(NSString *)name sex:(NSString *)sex

{

    self = [self initWithName:name sex:sex age:0];

    return self;

}


- (void)sayHi

{

    NSLog(@"Hi");

}


@end




Student.h

#import "Person.h"


@interface Student : Person

{

///  学生特有的成员变量

    NSString *_school;

    NSInteger _number;

}


///  自定义初始化方法

- (id)initWithName:(NSString *)name

               sex:(NSString *)sex

               age:(NSInteger)age

            school:(NSString *)school

            number:(NSInteger)number;


///  自我介绍方法

- (void)introduce;


@end



Student.m

#import "Student.h"


@implementation Student


///  自定义初始化方法

- (id)initWithName:(NSString *)name

               sex:(NSString *)sex

               age:(NSInteger)age

            school:(NSString *)school

            number:(NSInteger)number

{

    /*

     _name = name;

     _sex = sex;

     _age = age;

    */

    NSLog(@"Student类初始化开始");

    self = [super initWithName:name sex:sex age:age]; //父类是initWithName等等,必须先初始化父类的,再初始化子类的

    if (self) {

        _school = school;

        _number = number;

    }

    NSLog(@"Student类初始化结束");

    return self;

}


///  自我介绍方法

- (void)introduce

{

    NSLog(@"I am a Student, my name is %@, sex is %@, age is %ld.", _name, _sex, _age);

}


///  子类重写父类得方法(无需声明)

- (void)sayHi

{

    [super sayHi];  //  继承父类,先输出父类

    NSLog(@"Hi, I am a second student, my name is %@, What's your name?", _name);

}


@end



UniversityStudent.h

#import "Student.h"


@interface UniversityStudent : Student {

    

    NSString *_major;  //专业

}



///  完整初始化方法

- (id)initWithName:(NSString *)name

               sex:(NSString *)sex

               age:(NSInteger)age

            school:(NSString *)school

            number:(NSInteger)number

             major:(NSString *)major;


@end




UniversityStudent.m

#import "UniversityStudent.h"


@implementation UniversityStudent


///  完整初始化方法

- (id)initWithName:(NSString *)name

               sex:(NSString *)sex

               age:(NSInteger)age

            school:(NSString *)school

            number:(NSInteger)number

             major:(NSString *)major

{

    //  调用从Student类继承下来的初始化方法

    NSLog(@"UniversityStudent类初始化开始");

    self = [super initWithName:name sex:sex age:age school:school number:number];

    if (self) {

        //  对持有的成员变量--赋值

        _major = major;

    }

    //  返回自身对象

    NSLog(@"UniversityStudent类初始化结束");

    return self;

}


///  重写父类方法

- (void)introduce

{

    NSLog(@"我是一名高富帅%@ %@ %ld %@ %ld %@",

          _name, _sex, _age, _school, _number, _major);

}


@end



main.m

#import <Foundation/Foundation.h>

#import "Student.h"    //  只需导入子类

#import "Teacher.h"

#import "UniversityStudent.h"



int main(int argc, const char * argv[])

{


    @autoreleasepool {

        

        //  子类使用父类继承下来的方法

        Student *p = [[Student alloc] initWithName:@"Vivian" sex:@"women" age:18];

        [p introduce];     //  Student 定义的方法

        [p sayHi];         //  Person 定义的方法, 当子类重写父类得方法,先执行子类的方法。

        

        NSLog(@"main: %@", p);  //  打印自身地址

        

        Teacher *q = [[Teacher alloc] initWithName:@"bobo" sex:@"man" age:45];

        [q sayHi];

        

        NSLog(@"main: %@", q);  //  打印自身地址

        

        UniversityStudent *un = [[UniversityStudent alloc] initWithName:@"李敏镐" sex:@"" age:22 school:@"我家" number:110 major:@"搞不清"];

        [un introduce];

      

    }

    return 0;

}


我们在写类时,都需要完整的初始化方法。12点太晚类,明天来写。。










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值