《Objective-c》-(面向对象:类)

一、面向对象和面向过程的区别

以将大象装进冰箱为例:

  • 面向过程:

1.打开冰箱门

2.将大象装进去

3.将冰箱门关上

 

  • 面向对象

冰箱

1.开门

2.装东西(大象)

3.关门

总结:

  • 面向过程关注的是结局问题需要哪些步骤;
  • 面向对象关注的是解决问题需要哪些对象;

二、类

  • 面向对象中两个很关键的概念:类和对象

1.创建对象

创建对象需要现有类(建造图纸),图纸上表述清楚了对象应该具备的属性和功能(行为)

2.创建类

事物名称(类名):人(Person)

属性:身高(height)、年龄(age)等

行为(功能):跑(run)、吃(eat)

注:

1.一般名词都是类

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

3.类名的第一个字母必须大写;

4.不能有下划线,如果有多个英文单词组成,用驼峰标示

5.那个行为哪个类最清楚,就把这个行为设计到那个对象里

3.类的声明和实现

  • 完整的写一个类/函数,需要两个步骤,类的声明和实现(定义)
  • 类的声明:

@interface  类名

例:

@interface  Car

{

  // 这里声明对象的属性

}

// 这里声明一些行为(方法)

@end

  • 类的实现:

@implementation 类名 

// 这里是一些方法的实现

@end

例:

@implementation Car

// 方法的实现

@end

  • 利用类创建对象

 

Car *c = [Car new];

注:

1.OC中只能用指针变量间接来操作对象;

2.定义了一个指针变量c,c将来指向的是Car类型的对象

3.[Car new];会创建出来一个新的对象,并且会返回新对象本身(新对象的地址)

  •  第一个OC的类

/*
 类名:Car
 属性:轮胎数量、时速
 行为:跑
 
 完整的写一个函数:函数声明和定义(实现)
 完整的写一个类:类的声明和实现
 */

// 因为下面使用了NSObject
#import <Foundation/Foundation.h>

// 1.类的声明
// 用来声明对象的属性和行为
// :NSObject 目的是:让Car这个类具备创建对象的能力
@interface Car : NSObject
{ // 大括号内用来声明对象属性(实例变量/成员变量,默认会初始化为0)
    // @public可以让外部的指针间接访问对象内部的成员变量
    @public
    int wheels; // 轮胎个数
    int speed; // 时速
}

// 方法(行为):方法名、参数、返回值
// 只要是OC对象的方法,必须是以减号开头 - 开头
// OC方法中任何数据类型都必须用小括号()扩住
// OC方法中的小括号就一个作用:扩住数据类型
// - (void)run(); // 错误

- (void)run;

@end

// 2.类的实现
@implementation Car
// 方法的实现(说清楚方法里面的具体代码)

- (void)run
{
    NSLog(@"车子跑起来了");
}


@end

int main()
{
    // 在OC中,想执行一些行为,就写上一个中括号  [行为执行者 行为名称]
    // 利用类来创建对象
    // 执行了Car这个类的New行为来创建一个对象
    // 定义了一个指针变量p,p将来指向Car类型的对象
    // [Car new]会创建出一个新对象,并且会返回新对象本身(新对象的存储地址)
    Car *p = [Car new];
    
    p -> wheels = 4; // 访问成员变量
    
    p -> speed = 120; // 访问成员变量
    
    Car *p2 = [Car new]; // 这里又创建了一个对象
    
    p2 -> wheels = 5; // 访问成员变量
    
    p2 -> speed = 230; // 访问成员变量
    
    NSLog(@"车子有%d个轮子,时速为:%dkm/h", p -> wheels, p -> speed);
    
    NSLog(@"车子有%d个轮子,时速为:%dkm/h", p2 -> wheels, p2 -> speed);
    
    // 给p所指向的对象发送一个run消息,(OC中的消息机制)   [行为执行者  行为名称];
    [p run];
    
    return 0;
}

 

  • 第二个OC的类

/*
 类名:Person
 属性:(成员变量/实例变量)体重、年龄
 行为:(方法)走路
 */

#import <Foundation/Foundation.h>

// 1.类的声明
//   *成员变量
//   *方法的声明
@interface Person : NSObject
{
    @public
    int age;
    double weight;
}

- (void)walk;

@end

// 2.类的实现
//   *方法的实现
@implementation Person

- (void)walk
{
    NSLog(@"年龄为%d、体重为%f的人跑起来了", age, weight); // 谁调用这个walk方法,这里的age、weight就代表是谁的age、weight
}

@end

int main()
{
    // 在使用类创建对象之前,会先讲类加载进内存,并且只会加载一次,类中保存着方法列表
    // 创建出的每一个对象内部都默认存在一个isa指针,指向其类
    Person *p = [Person new];
    
    p -> age = 20;
    
    p -> weight = 50.3;
    
    [p walk]; // 当对象调用方法是,就会顺着该对象内部的isa指针找到类并执行类中相应的方法
    
    Person *p2 = [Person new];
    
    p2 -> age = 24;
    
    p2 -> weight = 60.5;
    
    [p2 walk];
    
    return 0;
}

 

  • 对象的简单内存分析

 Person *p = [Person new];
注:
1.在使用类创建对象之前,会将类加载进内存,并且只会加载一次
2.每个对象内部都默认拥有一个isa指针,并且这个isa指针指向所对应的类;
3.成员变量是每个对象都有的,方法是公共的。
 

三、常见错误及注意点

 
#import <Foundation/Foundation.h>
/*
 注意点1:@interface....@end  和  @implementation....@end不允许嵌套使用
 注意点2:@interface...@end(类的声明)必须写在创建该类([Car new])之前
 */
@interface Car : NSObject
{
    /*
     注意点3:成员变量必须写在@interface后面的大括号内
     注意点4:不允许在@interface里面对成员变量进行初始化
     注意点5:不能随便将成员变量当做C语言中变量使用,如:不能用static修饰
     */
    int wheels;
    int speed;
}
// 注意点6:方法的声明必须写在@interface中,并且必须写在大括号外面、
// 注意点7:不能讲OC中的方法当做C语言中的函数来使用,如:不能用static修饰
- (void)run;
@end



@implementation Car
// 注意点8:方法的实现必须写在@implementation中
- (void)run
{
    NSLog(@"轮子为%d、速度为%d的车子跑起来了", wheels, speed);
}
@end

int main()
{
    // 注意点9:只有创建了对象后才能使用成员变量
    // wheels = 4;
    return 0;
}
/*
 注意点10:方法和函数的区别
 方法:
 1.对象方法都是以减号 - 开头
 2.对象方法的声明必须写在@interface和@end之间
   对象方法的实现必须写在@implementation和@end之间
 3.对象方法只能由对象调用
 4.对象方法归类/对象所有
 
 函数:
 1.函数能写在文件中任意位置,函数归文件所有
 2.函数调用不依赖对象
 3.函数内部不能通过成员变量名直接访问对象的成员变量
 */

 

 
 
 
posted @ 2015-02-07 00:07  深秋的露水  阅读(183)  评论(0编辑  收藏  举报