/**
前文中的“类”,就是“类对象”
类对象的类型叫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