黑马程序员_OC_类和对象

来源:互联网 发布:北京胡同旅馆知乎 编辑:程序博客网 时间:2024/05/16 09:06

一.面向对象和面向过程的思想(对比)


OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同思想

1.    面向对象和面向过程的区别

1)      以用电脑听歌为例子

a)       面向过程

Ø   打开电脑

Ø   播放电脑中的歌曲

Ø   关闭电脑

 

b)       面向对象(不是相亲的“对象”)

Ø   电脑  

    开机  

    播放歌曲  

    关机


区别分析

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


二.类和对象关系


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

1.    如何创建对象

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

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

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

Ø   属性:轮子数、时速

Ø   功能(行为):跑

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

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

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

 

2.    OC中的面相对象

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

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

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


三.声明和定义类及方法的调用


 类名:Car

 属性:轮胎个数、时速(速度)

 行为:跑



// 因为使用了NSObject

#import <Foundation/Foundation.h>


// 完整地写一个函数:函数的声明和定义(实现)

// 完整地写一个类:类的声明和实现


// 1.类的声明

// 声明对象的属性、行为

// : NSObject 目的是:让Car这个类具备创建对象的能力

@interface Car : NSObject

{//用来声明对象属性(实例变量\成员变量,默认会初始化为0

    // @public可以让外部的指针间接访问对象内部的成员变量

    @public

   int wheels;// 轮胎个数

    int speed;//时速(xxkm/h)

}


// 方法(行为):方法名、参数、返回值(声明、实现)

// 只要是OC对象的方法,必须以减号 -开头

// OC方法中任何数据类型都必须用小括号()扩住

// OC方法中的小括号():括住数据类型

- (void)run;


@end


// 2.类的实现

// 用来实现@inteface中声明的方法

@implementation Car

// 方法的实现(说清楚方法里面有什么代码)


- (void)run

{

    NSLog(@"车子跑起来了");

}


@end


int main()

{

    //OC中,想执行一些行为,就写上一个中括号[行为执行者行为名称]

    //利用类来创建对象

    //执行了Car这个类的new行为来创建新对象

    

    //定义了一个指针变量pp将来指向的是Car类型的对象

    // [Car new]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址)

    Car *p = [Car new];

    

    

    Car *p2 = [Car new];

    p2->wheels =5;

    p2->speed =300;

    [p2 run];

    

    // p所指向对象的wheels属性赋值

    p->wheels =4;

    p->speed =250;

    

    //p所指向对象发送一条run消息

    [p run];

    

    NSLog(@"车子有%d个轮子,时速位:%dkm/h", p->wheels, p2->speed);

    

   return0;

}


*.注意错误


 方法

 1.对象方法都是以减号

 2.对象方法的声明必须写在@interface@end之间

   对象方法的实现必须写在@implementation@end之间

 3.对象方法只能由对象来调用

 4.对象方法归类\对象所有

 

 函数

 1.函数能写在文件中的任意位置(@interface@end之间除外),函数归文件所有

 2.函数调用不依赖于对象

 3.函数内部不能直接通过成员变量名访问某个对象的成员变量


@interface Car : NSObject

{//成员变量\实例变量

    //int wheels = 4; 不允许在这里初始化

    //static int wheels; 不能随便将成员变量当做C语言中的变量来使用

    @public

   int wheels;

}


- (void)run;

- (void)fly;

@end


四.方法及实现


#import <Foundation/Foundation.h>



计算器类

 方法:

 1> 返回 π 

 2> 计算某个整数的平方

 3> 计算两个整数的和



@interface JiSuanQi : NSObject


// 方法名:pi

- (double)pi;


// OC方法中,一个参数对应一个冒号

// 方法名:pingFang:(冒号也是方法名的一部分)

- (int)pingFang:(int)num;


//- (int)sum:(int)num1 :(int)num2;

// 方法名:sumWithNum1:andNum2:

- (int)sumWithNum1:(int)num1 andNum2:(int)num2;



//- (int)sumWithNum1:(int)num1 andNum2:(int)num2 andNum3:(int)num3;

@end


@implementation JiSuanQi


- (double)pi

{

   return3.14;

}


- (int)pingFang:(int)num

{

   return num * num;

}


//- (int)sum:(int)num1 :(int)num2

- (int)sumWithNum1:(int)num1 andNum2:(int)num2

{

   return num1 + num2;

}

@end


int main()

{

    JiSuanQi *jsq = [JiSuanQi new];

    

    

   int a = [jsq sumWithNum1:20 andNum2:5];

    //int a = [jsq sum:10 :5];

    

    //int a =  [jsq pingFang:10];

    

    //double a = [jsq pi];

    NSLog(@"%i", a);

    

   return0;

}


五.匿名对象


@interface Car : NSObject

{

    @public

   int speed;

}

- (void)run;

@end


@implementation Car


- (void)run

{

    NSLog(@"速度为%d的车子跑起来了", speed);

}


@end

int main()

{

   

   Car *c;

    c = [Car new];

    c->speed = 250;

    

    [c run];

    

    //不要写类似匿名对象这样的代码

    //只要求能说出输出结果

    [Car new]->speed =300;

    

    [[Car new] run];

    

   Car *c = [Car new];

    

   return0;

}


0 0