Person.h 文件 声明类的实例变量和方法
#import <Foundation/Foundation.h>
#pragma mark 类的声明
// @interface...@end:表示类的声明部分,将类的实例变量(特征)和方法(行为)写在这一对关键字之间。
// Person:表示本类的名字,也就是这个类叫什么
// : :冒号表示的是继承关系,冒号前面的类继承自冒号后面的类
// NSObject:根类(所有的类最终都继承自他,而他没有父类)
/********声明类的实例变量(特征)**********/
//接口标示 //本类名 //父类名
@interface Person : NSObject
{
@public // @public:实例变量的可见度修饰词,public表示公共的,使用public修饰的实例变量可以在类的外部随意访问。
// 声明类的实例变量(特征)
NSString *_name; //姓名
NSString *_gender; //性别
NSString *_hobby; //爱好
int _age; //年龄
// 实例变量的书写规则:实例变量的名字遵循驼峰命名法规则。在实例变量名前,使用下划线开头。
}
/********声明类的方法(行为)**********/
// 类的方法(行为)在大括号以外声明
// - :减号是方法的修饰符,减号表示这个方法只能由对象来调用(这个消息只能发送给对象),如果是+的话,表示这个方法只能用类来调用(这个消息只能发送给类)
// () 第一个小括号里写的是方法的返回值类型(也就是函数的返回值类型),void表示返回值为空,无返回值
// sayHi :表示方法名。
- (void)sayHi;
- (void)go;
#pragma mark 重写父类提供的方法
// id/instancetype:含义和void * 含义一样,有谁调用这个方法,那么该方法执行完成后的返回值类型和调用者的类型一致
// 如果我们需要重写父类提供的方法时,不需要再次声明,而且在调用时,会执行我们(在.m里)重写的方法。
- (instancetype)init;//方法声明(可以不写)
@end
#pragma mark 一对儿文件中管理两个类
// 我们使用一对儿.h和.m文件来管理一个类,但是也可以在一对儿文件中管理两个类,但是也可以在一对儿文件中管理两个类,声明部分使用@interface...@end来确定声明的范围,实现使用@implemention...@end来确定实现的范围,在对应的范围内写上对应的代码。但是,一般我们不这么干!!!
@interface Children : NSObject
{
NSString *_name;
}
- (void)playing;
@end
Person.m 文件 类的实现
#import "Person.h"
#pragma mark 类的实现
// @implementation...@end:表示类的实现部分,在头文件(接口文件)中声明的方法,在这里实现
@implementation Person
// 我们可以通过重写系统提供的初始化方法来定制自己需要的实例变量的值!
- (instancetype)init{
_gender = @"男";
_name = @"newZhinan";
_age = 22;
return self; // self:表示的时初始化完成的对象(main.m文件中上边赋值完成后的对象)
}
//实现部分标示
- (void)sayHi{
// NSLog: OC提供的打印函数,功能和C中的printf一样,在控制台输出指定的字符串
// 在OC中,表示一个字符串常量,使用@""表示
// 使用NSLog打印字符串,打印结束后会自动换行
NSLog(@"hello, i am daring");
}
- (void)go{
NSLog(@"i am running");
}
@end
#pragma mark 一对儿文件中管理两个类
@implementation Children
- (void)playing{
NSLog(@"做游戏");
}
@end
main.m 文件 使用类来创建对象
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
#pragma mark- 使用类来创建一个对象
// 创建出person1对象
// 1.使用alloc方法(前面是+,由类调用),在内存中开辟存储空间,并清零,将内存空间的首地址返回(给对象person1)
// []:方括号是OC中(方法调用)消息发送的表示符号,在方括号左边写的是消息的接受者。在方括号右边写的是消息(方法名)
// alloc:是以加号开头的,凡是以+开头的,表示的是类方法,只能由类名来调用
Person *person1 = [Person alloc];
// 2.使用init方法,将刚刚开辟出来的内存空间设置上出初始值和必要的配置(比如:注册方法列表等)
// init:是以减号开头的,凡是以-开头的,表示的是对象方法(实例方法),只能由对象来调用
person1 = [person1 init];
// 创建并初始化完成一个对象后,就可以使用这个对象来调用相关方法了。
[person1 sayHi]; // 说法:向对象person1发送消息sayHi
[person1 go];
// 我们可以把alloc和init合并在一行代码里,减少代码量。例如:再创建一个对象person2
Person *person2 = [[Person alloc] init];
// 通过对象,使用->找到对象的实例变量,并且赋值(过程和使用结构体指针给结构体成员变量赋值一样)
person2->_name = @"zhiNan"; // 给_name实例变量赋值(箭头访问实例变量)
person2->_gender = @"男";
person2->_hobby = @"打球";
person2->_age = 22;
// 使用NSLog打印这三个实例变量
// 使用%@作为OC中的对象的占位符:如果需要把一个对象转换为字符串打印输出,那么就是用%@作为占位符
NSLog(@"这个人的姓名:%@ 性别:%@ 爱好:%@ 年龄%d",person2->_name, person2->_gender, person2->_hobby, person2->_age);
NSLog(@"%@", person2);
NSLog(@"%p", person2);
#pragma mark 使用重写父类提供的方法
// 创建对象person3。
Person *person3 = [[Person alloc] init];// 如果重写了继承父类的方法,则使用重写的的初始化方法
NSLog(@"这个人的姓名:%@ 性别:%@ 年龄%d",person3->_name, person3->_gender, person3->_age);
return 0;
}