20.OC语言构造方法

OC语言构造方法

一、构造方法

(一)构造方法的调用

完整的创建一个可用的对象:Person * = [Person new];
New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法来分配存储空间(返回分配的对象);2)使用init方法来对对象进行初始。

可以把new方法拆开如下:
1.调用类方法+alloc分配存储空间,返回未经初始化的对象
Person *p1 = [person alloc];
2.调用对象方法-init进行初始化,返回对象本身
Person *p2 = [p1 init];
3.以上两个过程整合为一句:
Person *p = [[Person alloc] init];
说明:init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,-减号开头。默认初始化完毕后,所有成员变量的值都为0.

(二)构造方法的代码示例

需求1,如果我需要让每个对象创建出来的初始值是10,而不是1,应该怎么办呢?

// 创建一个人类,要求创建出来的所有对象的age的初始值为10


#import <Foundation/Foundation.h>


// Person类的声明

@interface Person : NSObject

@property int age;


@end


// Person类的实现

@implementation Person


// 重写init方法

- (instancetype)init

{

    // 1.初始化对象拥有的父类成员变量

    if (self = [super init]) {

        // 2.初始化对象自有的成员变量

        _age = 10;

    }

    // 3.返回一个已经初始化完成的对象

    return self;

}

@end


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

{

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

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

    return 0;

    

}

输出结果为:10


需求2,让学生继承人类,要求学生对象初始化之后,年龄是10,学号是1,怎么办?

// 需求2:创建一个学生类,要求创建出来的所有对象的age初始值为10,学号为1


#import <Foundation/Foundation.h>


// Person类的声明

@interface Person : NSObject

@property int age;

@end


// Person类的实现

@implementation Person

// 重写init方法

- (instancetype)init

{

    // 1.初始化对象拥有的父类成员变量

    if (self = [super init]) {

        // 2.初始化对象自有的成员变量

        _age = 10;

    }

    // 3.返回一个已经初始化完成的对象

    return self;

}

@end

// 学生类的声明和事项,学生类继承自人类

@interface Student : Person

@property int no;

@end

@implementation Student


- (instancetype)init

{

    // 1.初始化对象拥有的父类成员变量,调用父类的构造方法,把年龄设置为10

    if (self = [super init]) {

        // 2.初始化对象自有的成员变量,设置no的值为1

        _no = 1;

    }

    // 3.返回一个已经初始化完成的对象

    return self;

}

@end

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

{

    Student *s = [[Student alloc] init];

    NSLog(@"%d,%d",s.age,s.no);

    return 0;

    

}

(三)构造方法使用注意

(1)子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写够着方法的时候应该首相从父类继承而来的成员变量先进行初始化。
(2)原则:先初始化父类的额,再初始化子类的。
(3)重写构造方法的目的:味蕾让对象方法创建出来,成员变量就会有一些固定的值。
(4)注意点:#1先调用父类的构造方法[super init]; #2再进行了子类内部成员变量的初始化。

二、自定义构造方法

(一)自定义构造方法的规范

(1)一定是对象方法,以减号开头
(2)返回值一般式id类型
(3)方法名一般以initWith开头

(二)自定义构造方法的代码实现

Person 类的声明,其中声明了两个接收参数的自定义构造方法

#import <Foundation/Foundation.h>

// person类的声明

@interface Person : NSObject

@property NSString *name;

@property int no;


- (instancetype)initWithName:(NSString *)name;

- (instancetype)initWithName:(NSString *)name andNo:(int)no;

@end


Person类的实现


#import "Person.h"

// person类的实现

@implementation Person

// 自定义构造方法

// 接受1个参数的构造方法

- (instancetype)initWithName:(NSString *)name

{

    if (self = [super init]) {

        _name = name;

    }

    return self;

}

// 接受两个参数的构造方法

- (instancetype)initWithName:(NSString *)name andNo:(int)no

{

    if (self = [super init]) {

        _name = name;

        _no = no;

    }

    return self;

}


@end

Student 继承自 Person 类,声明了一个接收了一个接收三个参数的构造方法

#import "Person.h"


@interface Student : Person

@property int age;

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

@end

Student 类的实现


#import "Student.h"


// 学生类方法的实现

// 一个接受三个参数的自定义构造方法

@implementation Student

- (instancetype)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(int argc, const char * argv[])

{

    // 调用接受一个参数的自定义构造函数

    Person *p = [[Person alloc] initWithName:@"yangyong"];

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

    

    // 调用接受两个参数的自定义构造函数

    Person *p2 = [[Person alloc] initWithName:@"yangyong with", andNo:1];

    

    // 学生类调用接受三个参数的构造函数

    Student *s = [[Student alloc] initWithName:@"again" andNo:2 andAge:23];

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

    return 0;

}


(三)自定义构造方法的使用注意

(1)自己做自己的事情
(2)父类的方法交给了父类的方法来处理,子类的方法处理子类自己独有的属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值