黑马程序员-构造方法

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

Person.m

 

#import "Person.h"

@implementation

 

//重写-init方法

- (id)init

{

   //1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性

    self = [super init];//当前对象 self

   

    //2,如果对象初始化成功,才有必要进行接下来的初始化

    if (self != nil)

    {//初始化成功

       _age = 10;

    }

   

   //3,返回一个已经初始化完毕的对象

    return self;

}

 

//简写版

 

- (id)init

{

    if ( self == [super init])

    {

       _age = 10;

    }

    return self;

}

@end

Student.m

 

#import "Student.h"

- (id)init

{

    if( self = [super alloc])//不要追究self后面的等号,固定写法

    {  

       //_age = 10这句话是不必要而且错的,super父类-init里面有,就不用再赋值,而且因为_age是私有的,超过了成员变量的作用域

       _no = 1;

    }

    return self; 

}

 main.m

 

#import "Person.h"

 

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

//重写构造方法的目的:为了让对象创建出来,成员变量有个固定值

/*

重写构造方法的注意点

1.先调用父类的构造方法[super init]

2在进行子类内部变量的初始化。

 

*/

int main()

{

    Person *p = [Person new];

    /*new方法内部调用两个方法:完整创建一个可用对象

   1,分配存储空间 + alloc方法

   2,初始化   -init方法

    */

    //1.调用+alloc分配存储空间

    Person *p1 = [Person alloc];//Return a new instance of the receiving class.

   

    //2,调用-init进行初始化

    Person *p2 = [p1 init];

   

   //整合,以后不要写new,写init

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

    p3.age = 10;//每次保证创建出的对象成员变量为10

 

    //每个Person对象创建出来,他的_age是10.

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

 

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

    NSLog(@"----");

 

    return 0;

}

 

三个构造方法

Student

-(id)init

{

    if(self = [super init])

    {

       _no = 1;

    }

    return self;

 

}

Person

-(id)init

{

    if(self = [super init])

    {

       _age = 10;

    }

    return self;

 

}

NSObject

-(id)init

{

    isa = [self class];

    return self;

}

自定义构造方法

@interface Person : NSObject

@property NSString *_name;

@property int _age;

 

/*自定义构造方法的规范

1.一定是对象方法,以-号开头

2.返回值一般是id类型

3,方法名一般以initWith开头

*/

 

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

 

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

@end

 

@implementation Person

 

- (id)initWithName:(NSString *)name

{

    if ( self = [super init])

    {

       _name = name;

    }

    return self;

}

- (id)initWithAge:(int)age

{

    if(self = [super init])

    {

       _age = age;  

    }

}

 

- (id)initWithName:(NSString *)name andAge:(int)age

{

    if (self = [super init])

    {

       _name = name;

       _age = age;

    }

    return self;

}

@end

 

int main()

{

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

    //等价于Person *p = [[Person alloc] init];p.name =@"Rose";

 

    Person *p2 = [[Person alloc] initWithAge:20];

   

    Person *p3 = [[Person alloc] initWithName:@"jack" andAge:27];

}

 

#import "Person.h"

 

@interface Student : Person

@property int no;

 

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

@end

 

@implementation Student

 

//父类的属性交给父类方法去处理,子类的方法处理子类自己的属性

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

{

    /*将name,age传递到父类方法中进行初始化。自己管自己的no就行了

   好处:一旦父类改动name父类成员变量的名字,不会对这种方法产生影响,因为它对父类的成员变量已经交由父类自己处理。

    */

 

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

//注意name,age前面无类型。

    {

       _no = no;

    }

   

    /*if (self = [super init])

    {

       _no = no;

       self.name = name;

       self.age = age;

 

       //_name = name;父类变量私有不能在这里写

    //[self setName:name];首先调用本类里面的setName没有,再找super的。

    //[self setAge:age];

    }*/

    return self;

}

 

@end

 

int main()

{

    Student *s = [[Student alloc] initWithName:@"jim" andAge:23 andNo:3];

}

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com
黑马程序员的Python学习视频中的构造方法是指在面向对象编程中用于初始化对象的特殊方法。在第十三章的视频中,具体介绍了构造方法的相关内容。构造方法通常被称为`__init__`方法,它会在创建对象时自动调用,并可以用来给对象的属性进行赋值。在构造方法中,可以使用参数来接收外部传入的值,并将其赋给对象的属性。构造方法的一些注意事项包括:构造方法必须以双下划线开头和结尾,构造方法可以有参数也可以没有参数,构造方法中可以进行属性的赋值操作等等。通过学习和应用构造方法,可以更好地理解和使用面向对象编程的概念和原理。如果想要安装Python的NumPy库,可以使用`pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy`命令来进行安装。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [三、python基础语法进阶篇(黑马程序猿-python学习记录)](https://blog.youkuaiyun.com/yinsefeixingchuan/article/details/128752143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [8天Python从入门到精通 第十三章 面向对象 13.4 构造方法](https://blog.youkuaiyun.com/weixin_44226181/article/details/128911416)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值