/*
继承的本质:
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;
}