Objective-c - 继承的本质, new方法

/*

 继承的本质:

 

    1> 每一个类的内部都有一个属性 - isa指针,指向这个类的父类;

 

    2> 类创建对象,第一次访问类的时候会进行类加载,子类创建对象的时候,会将子类和其所有的父类一起加载到代码段.如果类里面有其他的类的对象做属性,那么其他的类也会加载到代码段.

 

    3> 在堆区开辟空间,创建对象,这个子类创建的对象拥有这个类的所有父类的所有属性,注意是属性,没有方法.

 

    4>如果是为对象设置属性,直接在堆区修改对应的属性即可.

 

    5> 如果要调用对象方法,则要通过对象内部的isa指针,找到代码区中的类,到类中寻找方法,如果没有找到,就到这个类的父类中区寻找,以此类类推,如果一直没有找到,就会报错.

 

 new方法做的事情:

 

    1>在堆区开辟空间存储对象,这个对象中会声明它对应的类中定义的所有属性(注意是属性,没有方法),还有一个isa指针,指向对应的在代码区中的类

 

    2>初始化这个对象内部属性的值

        1,基本数据类型初始化为:0

        2,OC的指针初始化为:nil :(0X0)不指向任何地址

        3,如果是C指针初始化为:NULL (0X0)

 

    3>返回这个对象在堆区的地址

 

 如下代码:

 

 */


#import <Foundation/Foundation.h>


#pragma mark -

#pragma mark 人类的创建

//声明

@interface YYPerson : NSObject

{

    NSString *_name;

    int _age;

}


- (void)setName:(NSString *)name;

- (NSString *)name;


- (void)setAge:(int)age;

- (int)age;


- (void)sayHi;


@end


//实现

@implementation YYPerson


- (void)setName:(NSString *)name

{

    _name = name;

}

- (NSString *)name

{

    return _name;

}


- (void)setAge:(int)age

{

    _age = age;

}

- (int)age

{

    return _age;

}


- (void)sayHi

{

    NSLog(@"哈喽!大家好!");

}


//重写description方法

- (NSString *)description

{

    NSString *description = [NSString stringWithFormat:@"姓名:%@ 年龄:%d", _name, _age];

    return description;

}


@end


#pragma mark -

#pragma mark 警察类的创建

//声明

@interface YYPolice : YYPerson

{

    NSString *_polNum;

}


- (void)setPolNum:(NSString *)polNum;

- (NSString *)polNum;


//巡逻的方法

- (void)patrol;


@end


//实现

@implementation YYPolice


- (void)setPolNum:(NSString *)polNum;

{

    _polNum = polNum;

}

- (NSString *)polNum

{

    return _polNum;

}


//巡逻的方法

- (void)patrol

{

    NSLog(@"我叫%@,%@!天气干燥,防火防盗!", _name, _polNum);

}


@end


#pragma mark -

#pragma mark main函数

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

    

    //创建警察对象

    YYPolice *POLICE = [YYPolice new];

    /*

     

     这句代码的执行过程:

        1>在堆区开辟空间存储对象,这个对象中会声明它对应的类中定义的所有属性(注意是属性,没有方法),还有一个isa指针,指向对应的在代码区中的类

     

        2>初始化这个对象内部属性的值

            1,基本数据类型初始化为:0

            2,OC的指针初始化为:nil :(0X0)不指向任何地址

            3,如果是C指针初始化为:NULL (0X0)

     

        3>返回这个对象在堆区的地址

     

     */


    

    //赋值属性

    [POLICE setName:@"展昭"];

    [POLICE setAge:30];

    [POLICE setPolNum:@"警员2004"];

    /*

     赋值属性:

        修改对象的属性,直接在堆区进行

     */

    

    //调用方法

    [POLICE patrol];//自己的方法直接调用即可

    //调用从父类继承的方法

    NSString *description = [POLICE description];

    NSLog(@"%@", description);

    /*

     调用从父类继承的方法:

        调用方法则通过对象内部的isa指针,找到代码区中的类,如果该类当中没有,就到该类的父类当中去寻找,依此类推,如果没有找到就会报错

     */

    

    return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值