-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------
OC中的基本概念
一、OC语言简介和特点
Objective-C:简称 ObjC 或 OC ,是扩充C的面向对象的编程语言。
二、OC和其他语言的区别;
1、OC 和java 语言一样,不支持多重继承,而C++语言支持多重继承
2、OC是动态类型,在运行时可以允许根据字符串名字来访问方法和类,还可以动态链接
3、OC与C的关系:OC向下兼容C
三、面向对象程序设计概念
面向对象程序设计主要包括:对象、类、数据抽象、继承、多态、数据封装、动态绑定、消息传递
1、类:具有相同的内部结构和运动规律的集合,具有相同类型的类的集合
2、对象:现实世界中的实体,具有相同类型的对象的抽象
3、方法:也称成员函数,是指对象上的操作,
4、消息:对象之间相互联系相互作用的方式,消息传递指的是一个对象调用了另一个对象的方法
5、继承:是类和类之间的关系,一个类共享了一个或者多个其他类定义的结构和行为,之类可以对基类的行为进行扩展、覆盖、重定义
6、多态:不同的多种对象可以以不同的方式响应相同名称方法的能力
7、封装:数据暴露在外不安全,为防止修改将数据和操作捆绑在一起隐藏起来,只对外界提供一个接口
8、动态绑定:指的是一个对象或者表达式的类型知道运行时才能确定其类型
四、类的声明和实现
1、类的声明(规定当前类的:类名、属性、行为)
@interface 类名:父类名
{
//定义类的属性
}
//类的行为
@end
2、类的实现(实现具体的行为)
@implementation 类名
//行为的具体实现
@end
例如:声明实现一个车的类
@interface Car :NSObject
{
@public;
//类的属性
int lunzi;
NSString *color;
int speed;
}
//类的行为
-(void)run;
@end
类的实现
@implementation Car
//行为的具体描述
-(void)run{
NSLog (@"车正在跑");
}
@end
五、OC中对象的创建
[ 类名 new ]
如:[Car new]
它做了三件事情:
1、向计算机申请一个内存空间
2、给类中的每一个成员初始化值
3、返回新申请的空间的首地址
需要定义一个Car类型的指针变量接收,因为返回的是一个空间的首地址
Car *p = [ Car new ];
理解方式有两种
第一:定义一个Car类型的指针变量,指向了新申请的内存空间,本质是指针
第二:用Car 类实例化了一个实例对象,对象的名称是p
六、对象成员变量的访问并赋值
p->lunzi = 3;
p->speed = 150;
p->color = @"蓝色";
七、OC中方法的方法
方法分为类方法和对象方法两种
对象方法:
1、对象方法以 — 开头,如-(void)run;
2、对象方法只能由对象来调用
3、对象方法中可以访问当前对象的成员变量
4、调用格式: [ 对象名 对象方法名 ];
类方法:
1、类方法以 + 开头,如 + (void)stop;
2、类方法只能由类来调用
3、类方法不能访问成员变量,因为类方法是由类类调用的,并没有创建存储空间来存储类中的成员变量
4、类方法调用格式:[ 类名 类方法名 ]
5、类方法的优点:不依赖于对象,执行效率高
6、当方法内部不需要使用到成员变量时,可以使用类方法
7、能用类方法解决的问题,尽量使用类方法
八、对象和方法之间的关系
1、对象作为方法的参数
#import <Foundation/Foundation.h>
typedef enum { kSexMan, kSexWomen, kSexYao }Sex;
//定义一个person类
@interface Person :NSObject
{
@public
NSString *_name;
Sex _sex;
}
//对象作为方法参数
-(void) dispPerson: (Person *) person;
//对象作为方法的返回值
-(Person *)changeSex: (Person *)person;
@end
//类的实现
@implementation Person
//类的实现
- (void) dispPerson: (Person *) person{
NSLog(@"姓名:%@,性别:%d",person->_name,person->_sex);
}
- (Person *)changeSex: (Person *) person{
//修改性别
person->_sex = kSexYao;
return person;
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//在此处输入Objective-C代码
//创建对象p
Person *p = [Person new];
//创建对象p1
Person *p1 = [Person new];
p1->_name = @"张三";
p1->_sex = kSexMan;
//对象作为方法的参数调用
[p dispPerson: p1];
[pool drain];
return 0;
}
2、对象作为方法的返回值
#import <Foundation/Foundation.h>
typedef enum { kSexMan, kSexWomen, kSexYao }Sex;
//定义一个person类
@interface Person :NSObject
{
@public
NSString *_name;
Sex _sex;
}
//对象作为方法参数
-(void) dispPerson: (Person *) person;
//对象作为方法的返回值
-(Person *)changeSex: (Person *)person;
@end
//类的实现
@implementation Person
//类的实现
- (void) dispPerson: (Person *) person{
NSLog(@"姓名:%@,性别:%d",person->_name,person->_sex);
}
- (Person *)changeSex: (Person *) person{
//修改性别
person->_sex = kSexYao;
return person;
}
@end
int main (int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//在此处输入Objective-C代码
//创建对象p
Person *p = [Person new];
//创建对象p1
Person *p1 = [Person new];
p1->_name = @"张三";
p1->_sex = kSexMan;
//对象作为方法的参数调用
[p dispPerson: p1];
[p changeSex: p1];
NSLog(@"姓名:%@, 性别:%d",p1->_name, p1->_sex);
[pool drain];
return 0;
}
九、函数和对象方法的区别
1、对象方法声明只能写在@interface...@end 中,实现只能写在@implementation...@end 中间
2、对象方法不能当做函数一样累调用
3、函数属于整个文件,可以写在文件的任何位置,可以写在@implementation...@end中,但是写在@interface...@end中会无法识别,函数的声明可以写在main函数的内部也可以写在main函数的外部
4、对象方法归对象、类所有
5、所有的函数是平行的,不存在隶属关系
6、函数使用的时候可以直接调用
7、函数不能访问它的成员变量