OC_03_初始化方法_便利构造器_继承

OC_03_InitMethodAndConvenienceConstructorAndInheritance

初始化方法,便利构造器,继承


继承:

继承的目的就是为了节省代码,提高代码的重复利用率

子类继承父类,会继承父类所有的特征和行为,父类的成员变量无论什么可见度都可以被继承,但是私有的成员变量能被继承,但是不能在子类里面进行使用.

当子类继承父类后,父类已有方法,子类可以不用声明,直接实现.

⾯向对象提供了继承语法,能⼤大简化代码。把公共的方法和实例变量写在父类里,子类只需要写自己独有的实例变量和⽅法即可 继承既能保证类的完整,⼜又能简化代码。

#import <Foundation/Foundation.h>

@interface Person : NSObject  //继承了NSObject


#import "Person.h"

@interface Student :Person   //Student继承了Person


OC只允许单继承

没有⽗类的类称为根类,OC中的根类是NSObject(上帝)

 继承的内容:所有实例变量和方法。

如果子类不满意父类方法的实现,可以重写(overwrite)父类的⽅方法。 

子类重写父类方法前提:子类和父类的方法名必须完全一样.



super是编译器指令,并⾮对象。作用:给super发消息,可以执⾏父类中实现的方法。

⼦类可以重写父类的方法,即:子类既⾃自己的实现,⼜又有父类继承下来的实现,如果想使⽤父类的实现,向super发送消息。 

[super walk];//super是本类的对象,用来找自己的父类方法


初始化方法

创建对象分两步:开辟空间、初始化。
初始化方法的主要作用是:为某些实例变量赋初值。
初始化方法在对象的整个生命周期里只使用一次。


学习继承之前,初始化方法,没有self = [super init]字样。我们为实例变量逐一赋值。

 学习继承之后,父类中声明了公共的实例变量。作为父类,也应该有自己的初始化方法,为这些公共实例变量赋初值。

⼦类定义了除父类中公共实例变量之外的实例变量。在自身的初始化方法中,优先向super发送init消息,初始化公共变量,初始化成功之后,再初始化自身特有变量,从而完成全部实例变量的初始化。



初始化过程

  1. ⾃⼰的初始化方法中,优先调用父类的初始化方法

  2. 父类的初始化方法中再调用父类的初始化方法,依次往上调用

  3. 处于最上层的初始化完成之后,回到第二层的初始化方法中,完成第二层的初始化。

  4. 第二层的初始化完成之后,回到第三层的初始化⽅方法中,依次执行初始化方法,直到本类的初始化方法完成 


初始化方法特征

初始化方法是 “-”⽅法,id或者instancetype类型的返回值,init开头,可以带0到多个参数

内部实现:先执⾏行super的初始化⽅方法,再初始化⾃自⾝身变量,return self 

例如:

Person.h

@interface Person : NSObject 

{

    NSString *_name;

    NSInteger _age;

    NSString *_sex;

}

 //自定义初始化方法完整版

- (id)initWithName:(NSString *)name

               age:(NSInteger)age

               sex:(NSString *)sex;


Person.m

- (id)initWithName:(NSString *)name

               age:(NSInteger)age

               sex:(NSString *)sex

{

    // 初始化父类继承过来的成员变量

    self = [super init];

    if (self != 0) {

        _name = name;

        _age = age;

        _sex = sex;

    }

    return self;

}


便利构造器

便利构造器在初始化方法的基础上前进了一小步。封装了对象创建过程。

便利构造器是“+”方法,返回 本类型 的实例,方法名以类名开头。可以有0到多个参数。

内部实现:封装了alloc和初始化方法。使用起来更加简洁。 

//便利构造器声明

+ (id)personWithName:(NSString*)name

            sex:(NSString*)sex

            age:(NSInteger)age;


//便利构造器实现

+ (id)personWithName:(NSString *)name

                 sex:(NSString *)sex

                 age:(NSInteger)age

{

    Person *p = [[Personalloc] initWithName:nameage:age sex:sex];

   return p;

}

注:initWith是自定义初始化方法,便利构造一般与自定义初始化方法连用,如果没有自定义初始化方法,

则用为Person *p = [[Person allocinit];


总结

继承是面向对象三大特性之一,合理的继承,能减少很多冗余代码,加快开发速度。

初始化方法以init开头,在对象的声明周期中只使用一次。

便利构造器封装了对象的创建过程,进一步简化了对象创建的步骤。 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值