1.首先,建立好一下工程,其中SubStudent继承于Student
2. OC语言的特点(p4):
OC是C语言的超集
OC具备完善的面向对象的特性
OC有个运行时系统(runtime)
OC有非常丰富的类库
3.返回到main.m 我们先看看头文件,先将Student.h导入
OC导入头文件用的是#import,而C用的是#include,那么这两个又有什么区别呢?
区别:在 Objective-C 中,#import 被当成 #include 指令的改良版本来使用。
除此之外,
#import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。
#import比起#include的好处就是不会引起交叉编译
#import<>跟#import”“的区别是:
#import” ” 导入自定义的头文件
#import< > 导入ios框架类库里类的头文件
4.往下,我们看到一个函数@autoreleasepool,翻译为自动释放池,那什么是自动释放池呢?
自动释放池技术提供一种机制,可以让我们将对象的所有权释放,但是不会导致对象马上被释放
通常我们不需要建立自己的自动释放池。在OC中,以后需要在main函数中创建对象都在我们的autoreleasepool中创建
,让它自动来帮我们管理对象的所有权释放。
5.面向对象的特征和概念
面向对象是把构成问题的事物分解成各个对象,然后协调各个对象之间的联系和通讯。
其基本思想:使用类、对象、属性、方法以及 封装、继承和多态等概念来进行程序设计。
什么是类?
类是一组具有相同属性(特征)和行为的对象的集合。
在OC中,类是由接口(interface)和实现(implementation)两部分构成。
什么是对象?
类的具体的实现。
.h是接口文件,用来实现属性的声明 和 方法 的声明。
.m是实现文件,用来属性和方法。
创建和使用对象
//OC创建对象的语法:
//类名 *对象名 = [[类名 alloc]init]; 或者 类名 *对象名 = [类名 new];
Student *stu =[[Student alloc]init];
Student *stu = [student new];
alloc 为对象动态分配内存地址 init 在内存中填上初始值
new 为alloc 和init 简写
如果给类中的属性赋值以及调用类中方法
对象名->实例变量名 = 具体值; //引用对象的实例变量
[对象名 方法名]; //引用对象的方法
6.我们来看看.h文件(即接口文件)
@interface @end 关键字, 表示声明的开始和结束。
在OC中继承的语法 “类名:父类名”
我们看看属性和方法,并举个小例子
@interface Student : NSObject
{
@public
//用来定义类的属性
NSString *_name;
NSInteger *_age;//int age;
@private
NSString *_hobby;
@protected
NSString *_address;
/*
属性的作用域
@public 公开的,任何类的方法都可以访问
@protected 受保护的,只有类本身和类的子类可以访问
@private 私有的,只有类本身可以访问
*/
}
//方法声明
/*
减号(-)表示该方法为实例方法;
加号(+)表示该方法为类方法;
void表示无返回值类型,其他的类型还有 NSString,NSInteger,CGFloat...
*/
-(void)sayHello;
-(NSString *)eatSupper;
+(NSString *)playGame;
7.再看看Student.m文件,即实现文件
//@implementation @end 关键字, 表示声明的开始和结束,在其中实现接口文件中声明的方法
@implementation Student
-(void)sayHello{
NSLog(@"Hello,My name is Mr.Zhang!");
}
-(NSString *)eatSupper{
if (_age < 18) {
return [NSString stringWithFormat:@"%@姑娘,今晚有空吃饭么",_name];
}
else{
return [NSString stringWithFormat:@"%@姑娘,不吃饭咱就去看电影吧",_name];
}
}
+(NSString *)playGame{
return @"小撸怡情,大撸伤身,强撸灰飞烟灭,别玩LOL!";
}
@end
8.基本的概念基本就介绍完了,我们来举个栗子吧~
#import "SubStudent.h"
@implementation SubStudent
-(void)sayWord{
//@public 修饰的 ,所有类都能访问
NSLog(@"%@",_name);
NSLog(@"%ld",(long)_age);
//@protected修饰的,该类和其子类都可以访问
NSLog(@"%@",_address);
//NSLog(@"%@",_hobby);
}
@end
#import "Student.h"
@interface SubStudent : Student
-(void)sayWord;
@end
来看看主函数main.m
//手动创建一个类
@interface Teacher : NSObject
{
@public
NSString *_name;
}
-(void)classBegin;
@end
//相当于一个实现文件
@implementation Teacher
-(void)classBegin{
NSLog(@"%@ say class begin",_name);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *stu = [Student new];
//Student *stu1 = [[Student alloc]init];
stu->_name = @"Rose";
[stu sayHello];
NSLog(@"Student ->name = %@",stu->_name);
stu->_age = 22;
NSString *result = [stu eatSupper];
NSLog(@"%@",result);
// stu->_hobby = @"\"诶...敲代码,CF,LOL,DNF,QQ三国\"";
[Student playGame];
//手动创建一个类
Teacher *teacher = [Teacher new];
teacher->_name =@ "Rose";
[teacher classBegin];
}
return 0;
}
最后运行的结果为: