OC语言——构造方法

构造方法

一,概念相关。

   构造方法其实就是-init方法。

   例:完整的创建一个可用的对象:Person *p = [Person new];

   New方法创建的内部拆分原理,分为两部分,分别完成两部份的事情:

1,分配内存

   +alloc方法/类方法

     Person *p1 = [Person alloc];

2,初始化

    -init方法/对象------它初始化结束后默认为0

    Person *p1 = [p1 init];

    合成一句后,先给对象分配内存再初始化:

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

代码说明:

如果我想要每个对象创建出来后,初始值是10,而不是0.

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property int age;
@end

@implementation Person
//重写构造方法,init
- (id)init
{
    //要调用回super父类的init方法,声明父类中的成员变量和一些其它属性。
    //self = [super init]; 可以当作是固定写法
    
    //如果对象初始化成功,才有必要进行下一步操作
    // if(self != nil)
    
    if(self = [super init])
    {
        _age = 10;
    }
    return self; //返回一个初始化的值
}
@end

int main()
{
    //Person *p = [Person new];
    //开发中很少用,因太死板
    
    /*
     new完整的可以分为两步
     1,分配存储空间    +alloc 类方法
     2,初始化   -init再调用这就可以用
     */
    
    //开发中有可能用其它方法进行初始化,所以一般用alloc不用init
    
    Person *p = [[Person alloc] init];
    NSLog(@"%d", p.age);
    
    return 0;
}

如果我想要每个对象创建出来后,初始值年龄是10,学号是1.

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property int age;
@end

@implementation Person
//重写构造方法,init
- (id)init
{
    //要调用回super父类的init方法,声明父类中的成员变量和一些其它属性。
    //self = [super init]; 可以当作是固定写法
    
    //如果对象初始化成功,才有必要进行下一步操作
    // if(self != nil)
    
    if(self = [super init])
    {
        _age = 10;
    }
    return self; //返回一个初始化的值
}
@end
//学生类继承人类,学生类声明和实现
@interface Student : Person
@property int no;
@end

@implementation Student

- (id)init
{
if(self = [super init])
{
    //设置no == 1;
    _no = 1;
}
    //返回一个已经初始化完成的对象
    return self;
}
@end

int main()
{
    //Person *p = [Person new];
    //开发中很少用,因太死板
    
    /*
     new完整的可以分为两步
     1,分配存储空间    +alloc 类方法
     2,初始化   -init再调用这就可以用
     */
    
    //开发中有可能用其它方法进行初始化,所以一般用alloc不用init
    
    Student *p = [[Student alloc] init];
    NSLog(@"%d,%d", p.age,p.no);
    
    return 0;
}


使用注意

1,子类拥有自己的成员变量和从父类继承来的成员变量,在重写构造方法的时候,应该是先初始化父类再初始子类。

2,原则是先初始化父类,再初始化子类

3,重写构造方法的目的:创建对象出来,成员变量就有一个固定的值

4,注意:调用父类构造方法[super init], 再进行子类成员变量初始化。

自定义构造方法

一,格式

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

   2,返回值一般是id

   3,方法名一般initWith开头

二,代码说明

Person的声明

#import <Foundation/Foundation.h>


@interface Person : NSObject
@property NSString *name;
@property int no;

- (id)initWithName:(NSString *)name;
- (id)initWithName:(NSString *)name andNo:(int)no;
@end

Person的实现

#import "Person.h"

@implementation Person
//接收一个参数的构造方法
- (id)initWithName:(NSString *)name
{
  if( self = [super init])
 {
    _name = name;
 }
    return self;
}
//接收两个参数的构造方法
- (id)initWithName:(NSString *)name andNo:(int)no
{
    if(self = [super init])
    {
        _name = name;
        _no = no;
    }
    return self;
}
@end


Student的声明

#import "Person.h"

@interface Student : Person
@property int age;

- (id)initWithName:(NSString *)name andNo:(int)no andAge:(int)age;
@end

Student的实现

#import "Student.h"

@implementation Student
- (id)initWithName:(NSString *)name andNo:(int)no andAge:(int)age
{
    //调用父类的构造方法,并初始化两个成员变量
if(self = [super initWithName:name andNo:no])
{
   //初始化自己独有的成员变量
    _age = age;
}
    return self;
}
@end


测试函数

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"

int main()
{
    //调用自定义构造函数,并接收一个参数。
    Person *p = [[Person alloc] initWithName:@"ywf"];
    NSLog(@"%@",p.name);
    
    //调用自定义构造函数,并接收两个参数。
    Person *p1 = [[Person alloc] initWithName:@"ywf" andNo:1];
    NSLog(@"%@ %d",p1.name,p1.no);
    
    //学生类调用接受三个参数的构造方法
    Student *s = [[Student alloc] initWithName:@"ywf" andNo:1 andAge:100];
    NSLog(@"%@  %d  %d",s.name,s.no,s.age);
    
    return 0;
}


使用注意

   1,自己做自己的事情。

   2,父类的方法给父类来处理,子类的方法处理自己的属性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值