C18_OC08-load、initialize、description

/**
 前文中的“类”,就是“类对象”
    类对象的类型叫Class-类(看到这个单词,似乎有种Java的亲切感)
 前文中的“对象”,就是“实例对象”
    实例对象的类型叫类
 程序启动时,会加载全部的类(原类)和分类(增强类),加载完毕会执行一次且仅一次各类的load
 程序启动后,当第一次调用某个类(类对象)时,会执行一次且仅一次其initialize方法
**/

#import <Foundation/Foundation.h>

@interface Persion : NSObject
    // + (void) load;
    // + (void) initialize;
    // +(NSString *)description;
    // - (NSString *)description;
@end

@implementation Persion
    // 父类的load方法优先调用,逐级调用全部类的load方法
    + (void) load{
        NSLog(@"Persion的load方法");
    }

    // 只有用到了这个类,才调用这个类的initialize方法,并且先调用父类的
    +(void) initialize{
        NSLog(@"Persion的initialize方法");
    }
/*
    // 如同Java的toString方法,区别是Java是自动的。如果重写,会影响子类。如果需要,父子类都要重写
 
    // 静态的toString,由Class-类对象调用
    +(NSString *)description{
        return @"这个类叫Persion";  // 默认打印 <类名:0xXXXXXX内存地址>
    }

    // 动态的toString,由实例对象调用
    -(NSString *)description{
        // 可以像Java一样把各个属性都打印出来
        return [NSString stringWithFormat:@"对象类型Persion,属性无"];  // 默认打印 类名
    }
 */
@end

@interface Student : Persion
    // + (void) load;
    // + (void) initialize;
@end

@implementation Student
    // 全部类的load方法都会被执行一次
    + (void) load{
        NSLog(@"Student的load方法");
    }

    +(void) initialize{
        NSLog(@"Student的initialize方法");
    }
    -(NSString *)description{
        return @"这是子类的动态description方法";
    }
@end

@interface Student (CN)
    // + (void) load;
    // + (void) initialize;
@end

@implementation Student (CN)
    // 增强类的load方法在原类的load后调用
    + (void) load{
        NSLog(@"Student(CN)的load方法");
    }

    // 增强类的initialize会覆盖原类的initialize
    + (void) initialize{
        NSLog(@"Student(CN)的initialize方法");
    }
@end

int main()
{
    /** 程序一执行,即加载各个类。调用每个类的load方法 **/
    [Student alloc];                // 加载结束,开始使用。从这个类的父类开始调用initialize方法
    
    /** NSLog打印对象时,会根据%@对应的是Class类对象还是实例对象匹配其静态或动态的description方法 **/
    id p = [[Persion alloc] init];
    NSLog(@"%@", p);                // p是一个实例对象,调用其  - (NSString *) description 方法
    NSLog(@"%@", [Persion class]);  // [Persion class]返回Class,调用其 + (NSString *) description 方法
    
    /** 执行子类的description方法前,先执行父类的description方法。如果父类的重写了,而子类的没有重写,调用子类的方法结果为父类方法的结果 **/
    id s = [[Student alloc] init];
    NSLog(@"%@", s);                // 调用实例对象的description方法
    NSLog(@"%@", [s class]);        // 调用类对象的description方法
    
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值