C18_OC08-load、initialize、description

来源:互联网 发布:商品期货讨论软件 编辑:程序博客网 时间:2024/06/14 14:27
/** 前文中的“类”,就是“类对象”    类对象的类型叫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方法");    }@endint 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