首页 > 代码库 > 黑马程序员—12-oc类跟对象

黑马程序员—12-oc类跟对象

一、类和对象的关系

面向对象中有2个非常重要的概念:类和对象

1. 如何创建对象

1)  面向对象解决问题的时候必须有对象,那如何创建对象呢?

 

2)  现实生活的例子:如何创造汽车对象?

a)   需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)

Ø   属性:轮子数、时速

Ø   功能(行为):跑

b)   然后再根据图纸上的描述生成汽车

c)   每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例

d)   图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括

 

2. OC中的面相对象

1)  OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类

2)  OC利用类来创建对象,对象是类的具体存在

3)  因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象

 

3. 需要设计哪些类,如何设计类

1)  类的设计,只关心3样东西:

Ø   事物名称(类名):

Ø   属性:

Ø   行为(功能):

 

2)  一般名词都是类

 

3)  拥有相同(或者类似)属性和行为的对象都可以抽像出一个类

二、定义OC的类和创建OC的对象

类的声明一般采用如下形式:

1. 类的声明

1)   代码编写

Ø   定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑

Ø   类名\属性的命名规则:标示符的规则

Ø   类名的命名规范:有意义、驼峰标识、首字母大写

#import <Foundation/Foundation.h>

// 类的声明

@interface Car : NSObject

{

    @public

    int wheels; // 多少个轮子

    int speed; // 时速

}

- (void)run; // 跑的行为

@end

 

2)   成员变量

Ø   @interface的大括号{}中声明的变量:wheels、speed

Ø   @interface的大括号和函数的大括号是不一样的

Ø   默认会初始化为0

 

3)    @public

@public可以让Car对象的wheels和speed属性被外界访问

 

4)    NSObject

加上:NSObject的目的是让Car类具备创建对象的能力

 

2. 类的实现

// 类的实现

@implementation Car

- (void) run

{

   NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);

}

@end

 

3. 创建对象

1)  代码编写

// 主函数

int main()

{

    // 创建车子对象

    Car*c = [Car new];

   c->wheels = 3;

   c->speed = 300;

   

    [crun];

    return 0;

}

2)  main函数的代码分析、内存分析(对象在内存中有成员)

Ø   [Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址

Car *c = [Car new];

用一个指针变量c指向内存中的Car对象  

Ø   设置车子对象的属性

跟用指向结构体的指针访问结构体属性一样,用->

c->wheels = 3;

c->speed = 300;

 

4. 创建多个Car对象

Ø   分别只设置wheels、speed属性

Car *c1 = [Car new];

c1->wheels = 4;

Car *c2 = [Car new];

c2->speed = 250;

[c1 run];

Ø   1个赋值给另一个,然后修改属性

Car *c1 = [Car new];

c1->wheels = 4;

c1->speed = 250;

Car *c2 = c1;

c2->wheels = 3;

[c1 run];

三、类方法

1. 基本概念

直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)

2. 类方法和对象方法对比

1)   对象方法

Ø   以减号-开头

Ø   只能让对象调用,没有对象,这个方法根本不可能被执行

Ø   对象方法能访问实例变量(成员变量)

2)   类方法

Ø   以加号+开头

Ø   只能用类名调用,对象不能调用

Ø   类方法中不能访问实例变量(成员变量)

Ø  使用场合:当不需要访问成员变量的时候,尽量用类方法

3)   类方法和对象方法可以同名

4)   类方法的好处

Ø  不依赖于对象,执行效率高

Ø  能用类方法,尽量使用类方法

Ø  场合:当方法内部不需要使用到成员变量时,就可以改为类方法

5)    工具类:基本没有任何成员变量,里面的方法都是类方法

#import<Foundation / Foundation.h>

@interfacePerson : NSObject

-(void)test;

+(void)test;

@end

 

@implementationPerson

-(void)test

{

    NSLog(@"对象方法\n");

    [Person test];

}

+ (void)test

{

    NSLog(@"类方法");

}

@end

 

int main()

{

    Person *p = [Person new];

    [p test];

    return 0;

}

输出结果:对象方法

    类方法

      

四、self关键字

1. 成员变量和局部变量同名

Ø   当成员变量和局部变量同名时,采取就近原则,访问的是局部变量

Ø   用self访问成员变量,区分同名的局部变量

2. 使用细节

1)  出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数

2)  作用

Ø   使用 "self->成员变量名" 访问当前方法调用的成员变量

Ø   使用 "[self 方法名];" 来调用方法(对象方法\类方法)

黑马程序员—12-oc类跟对象