重写构造方法及自定义构造方法的理…


构造方法

    1,什么是构造方法:

        用来初始化对象的就是构造方法;是个对象方法,- 开头


    2,创建对象:Person *p=[Person new];默认初始化

        new方法内部做了3件事情:

        (1)使用alloc方法来分配存储空间(返回分配的对象);

        (2)使用init方法来对象进行初始化。

        (3)返回对象的内存首地址。


    可以把new方法拆开如下:

        (1).调用类方法alloc分配存储空间,返回未经初始化的对象

            Person *p1=[Person alloc];

        (2).调用对象方法init进行初始化,返回对象本身

            Person *p2=[p1 init];

        (3).以上两个过程整合为一句:

            Person *p=[[Person alloc] init];

注意:

    alloc只是为该类分配内存空间,以存放该类的全部实例变量 。

    init方法就是构造方法,是用来初始化对象的方法。


一个刚刚分配的对象并不能立即使用 ,

需要先初始化该对象,然后才能使用它 ,

如果未进行初始化, 随后可能会出现一些不可预测的行为.


默认初始化:

    1,给基本数据类型的变量 初始化值为0;

    2,给对象类型 初始化值为nil(0);


重写构造方法

重写构造方法的目的:

    对象创建完成后,自动有一些默认值。


重写构造方法的固定格式:

- (instancetype)init{

    self = [super init];

    if (self) {

     }

    return self;

}


1. [super init]的作用:先调用父类的初始化方法,对从父类继承过来的成员变量进行初始化。初始化完了之后,返回我当前的对象指针。


2.重写构造方法注意事项:

构造方法使用注意

(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候 应该首先对从父类继承而来的成员变量先进行初始化。

(2)原则:先初始化父类的,再初始化子类的。

(3)重写构造方法的目的:为了让对象方法一创建出来,成员变量就会有一些固定的值。

(4)注意点:先调用父类的构造方法[super init]; 再进行子类内部成员变量的初始化。


3.构造方法应用场景:

如果对象中的一些属性需要在初始化的时候就需要有值, 可以使用构造方法来完成.


自定义构造方法

1. 自定义构造方法的规范

(1)一定是对象方法,以减号开头

(2)返回值一般是id类型或者instancetype类型

(3)方法名一般以initWith开头


2. 自定义构造方法的实现

- (instancetype)init

{

    self = [super init];

    if (self) {

        // 要初始化的成员变量.

    }

    return self;

}


3.自定义构造方法的使用注意

(1). 自己做自己的事情

(2). 父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性


自定义构造方法

1. 自定义构造方法的规范

(1)一定是对象方法,以减号开头

(2)返回值一般是id类型或者instancetype类型

(3)方法名一般以initWith开头


2. 自定义构造方法的实现

- (instancetype)initWithName:(NSString *)name andAge:(int)age;

{

    self = [super init];

    if (self) {

        // 要初始化的成员变量.

        _name = name;

        _age = age;

    }

    return self;

}


3.自定义构造方法的使用注意

(1). 自己做自己的事情

(2). 父类的方法交给父类的方法来处理,子类的方法处理子类自己独有的属性


4.使用场景

如果对象被创建的时候, 需要对里面某些属性进行初始化(设置), 这个时候就可以使用构造方法


5,instancetypeid的作为返回值的区别;

instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;


重写构造方法代码实现:


#pragma mark FaShi.h

#import "Person.h"

// 假设 FaShi  coin = 1000, level = 1  blood = 100;

@interface FaShi : Person

@property int blood;

 @end


#pragma mark FaShi.m

#import "FaShi.h"

@implementation FaShi

-(instancetype)init{

    //[super init]  一定要先调用父类的init方法

    if (self = [super init]) {

        _blood= 100;

    }

return self;

}

  @end


#pragma mark main.m

#import

#import "Person.h"

#import "FaShi.h"

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

    @autoreleasepool {

        FaShi*fa = [[FaShialloc] init];

        Person*p = [[Personalloc] init];

        NSLog(@"p.coin = %d,p.level = %d",p.coin,p.level);

    NSLog(@"fa.blood = %d,coin=%d,level = %d",fa.blood,fa.coin,fa.level);

    }

    return 0;

}


#pragma mark  Person.h

#import

@interface Person : NSObject

//   int _coin;

//   int _level;

@property int coin;

@property int level;

  @end


#pragma mark  Person.m

#import "Person.h"

@implementation Person

//重写

- (instancetype)init{

    self = [super init];  //初始化父类

    if (self) {

//初始化子类自己的东西

        _coin = 1000;

        _level = 1;

 }

返回self ----> alloc 完成的那个对象

    return self;

} 

@end


自定义构造方法的代码实现:

#pragma mark  main.m

#import

#import "Person.h"

#import "Student.h"

//Person 类创建成功后,给人起一个名字

//创建一个学生的类

//要求创建学生的时候,指定姓名 年龄 学号

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

    @autoreleasepool {

        Person*p = [Personnew];

        NSLog(@"%d,%@",p.age,p.name);      

//        用指定的值进行初始化,

//        创建对象的时候,用我们指定的名字和年龄进行初始化

//         Person *p = [Person new:@“xxx” andAge:18];

        Person*p1 = [[Personalloc] initWithName:@"张三丰"andAge:19]; 

//      Person *p2 = [[Person alloc] initWithName:@"我是谁" andAge:89];    

      NSLog(@"%d,%@",p1.age,p1.name);   

        //创建学生的对象

        Student *stu = [[Student alloc] initWithName:@"张无忌" andAge:23andSNO:120];  

         NSLog(@"%d,%@,%d",stu.age,stu.name,stu.sno);

    }

    return 0;

  }

#pragma mark  Person.h

#import

@interfacePerson : NSObject

@property NSString* name;

@property int age;

-(instancetype)initWithName:(NSString *)name andAge:(int)age;

@end


#pragma mark  Person.m

#import "Person.h"

@implementation Person

-(instancetype)initWithName:(NSString *)name andAge:(int)age{

   if(self= [superinit]) {

        _name = name;

        _age = age;

    }

    return self;

}

@end


#pragma mark  Student.h

#import "Person.h"

@interfaceStudent : Person

@property int sno;

-(instancetype)initWithName:(NSString *)name andAge:(int)age andSNO:(int)sno;

  @end


#pragma mark  Student.m

#import "Student.h"

@implementation Student

-(instancetype)initWithName:(NSString *)name andAge:(int)age andSNO:(int)sno{

  if (self = [super initWithName:name andAge:age]) {

 //初始化学号

      _sno = sno;

 //        l4hbh

    }

    return self;

}

@end




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值