黑马程序员_OC面向对象思想和类的创建

来源:互联网 发布:电子烟发热丝数据 编辑:程序博客网 时间:2024/05/18 01:25
<span style="font-size:18px;"></span>


(一)面向对象

面向对象,不仅是一种变成技术,更是一种编程思想,是学好OC的一种重要思想。而C语言是面向过程编程,两者截然不同。下面为两种思想的缩写。

OOP:Object Oriented Programming-->面向对象编程。

OO:Object Oriented -->面向对象。

Procedure Oriented-->面向过程。

现在来分析一个实例;

我想用羽毛球拍打球:

1.C语言:C语言侧重解决问题的步骤,我-->拿起来羽毛球牌-->打球-->打球结束放下羽毛球拍。执行实例都是一步一步

的完成,你让我怎么做我就按照顺序来做,旨在解决问题的步骤。

2.OC语言:OC语言面向对象,万物皆对象,我只需要找对象,不用分析做这件事的步骤,谁具备我需要的功能,我就

能找到一个相应的对象来实现我的功能。我想用羽毛球拍打球,那我就找到羽毛球拍,执行羽毛球拍的打球功能,至于

功能怎样实现,与我无关。这就是一种面向对象的想。

再看一个实例:

我电脑坏了,要修理:

1.C语言:我-->打开电脑-->开机-->检测硬件是否坏了-->检测系统是否坏了-->维修-->关机。

2.OC语言:我-->找到维修工,维修工具备我需要的功能,我找到维修工这个对象-->调用维修工的修理功能修好电脑。

我无需再分析修电脑的步骤和过程。

总结:面向对象和面向过程是两种不同的思想。都能解决问题,但是两者思路截然不同。面向对象更符合人的思路,需

要什么就找什么,需要什么方法就找什么方法。而不是一大堆都自己来做。这是一种较为先进的思想。

注:其实OC的本质还是面向过程。只是苹果给它加了一件面向对象的衣服。OC的本质是结构体。

( 二)类和对象

既然万物皆对象。但是要实现在代码中,还需要说明一个类。类好像是一类对象的整体统称,又好像是”图纸“和”产物“之

间的关系。有类才有对象。想要创建对象必须要创建类。类的创建分为三个步骤。

1.类的名称

类的名称一般首字母大写,要取的有意义。例如人这个类,就可以定义为Person。车类定义为Car。

2.类的成员变量(实例变量/属性)

类的属性就是说明这个类拥有什么共同的点。例如Person人这个类,人都拥有年龄,身高,体重。这些都可以是属性。

3.类的方法(行为/功能)

说明类具有哪些行为,例如Person人这个类具有吃法,跑步,睡觉等行为。

这三个步骤在代码的实现中,可以规划成两个步骤,类的声明和实现(定义),下面由代码延伸出今日所学的关键字用法

和类的创建说明。

<span style="font-size:18px;">#import <Foundation/Foundation.h>@interface Student : NSObject{    tring *_nam@public    int _no;    NS    Se;}- (void)study;@endvoid)study{    NSLog(                    void)study    {        NSLog(                            @implementation Student              -              (@"学号为%d的%@学生正在学习",_no,_name);              }              @end              int main()              =        {            Student *s = [Student new];            s->_no            100;            s->_name=@"梁萧";            [s study];            return 0;        }</span>

(1)类的成员变量(实例变量/属性)声明:用@interface 类 :NSObject后面的{}来实现定义,如上述代码的int _no;和

NSString *_name。其实也可以定义@implementation和@end之间,只不过用的较少。@interface Student : NSObject

这段代码的意思是创建一个 Student类,继承自NSObject(它的父类/超类是NSObject-----一个OC最基本的类)。然后

下面的大括号定义属性。

<span style="font-size:18px;">@interface Student : NSObject{@public    int _no;    NSString *_name;}- (void)study;@end</span>


(2)类的方法的声明:规则都是- (返回值)方法/行为;其实以-开头的都是对象方法,只能够通过对象来调用。如下实

现了一个简单的study方法的声明。声明后要进行方法的实现。

- (void)study;

(3)类方法的实现:OC的方法的实现比较特殊,都是在@implementation和@之间完成方法的实现。实现要求定义出

这个方法具体做了什么。如刚才声明了一个study方法,则要实现它,输出当前对象的学号和姓名。

<span style="font-size:18px;">@implementation Student- (void)study{    NSLog(@"学号为%d的%@学生正在学习",_no,_name);}</span>

至此我们完成了一个类完整的成员变量的声明,方法的声明和实现。下面有几点注意点:

①:类名首字母必须大写,且不能有下划线,可以用驼峰标示。

②:谁清楚这个行为怎么做,就应该把这个行为放到哪个类。

③:一个完整的类,应该拥有类的声明,属性和行为(实现)。

④:[  ]是OC中得一种行为,涉及到执行操作,都需要[行为执行者  行为名称  ]

⑤:若要想类具有创建对象的能力,则要让类继承NSObject。NSObject也是一个类,定义在Foundation框架中。

⑥:定义好的成员变量默认初始值为0.并且成员变量也叫实例变量,属性。不可以在@interace中直接对成员变量赋

值。

⑦:定义成员变量时出现了@public-->这是成员变量的一种作用域。代表任何地方都可以直接访问。成员变量一共有四

种作用域。

@private-->私有变量,只能在当前类的对象方法中直接访问。

@protected-->可以在当前类和子类的对象方法中直接访问。

@public-->任何地方都可以访问,包括main主函数。

@package-->同一个框架内可以访问。

⑧:OC方法定义和实现中,( )只有一个作用,就是括住数据类型。

⑨:OC的消息机制:[ Student * study ];表示给Student这个类型的指针所指向的对象发送一个study消息。执行后,就

会直接找run方法的实现。

我们可以发现,一个@interface和一个@end对应,一个@implementation和一个@end对应,两者是不能互相嵌套的,

会与最近的@end组成配对。而且@interface就像是钟表的外表,@implementation就像钟表内部的运转原理。

(4)完成了类的声明和实现后,可以在main函数中创建类的新对象。采用[类  new]方法来创建对象(new是NSObject

的一个方法,因为Student继承NSObject这个类,所以可以使用此方法)。

Student *s = [Student new];
    s->_no = 100;
 [s study];
    s->_name=@"梁萧";

在OC中,方法,变量的改动都是需要依靠指针的。现在通过Student new方法创建出了一个新对象,让Student *类型的

指针存储这个对象。通过指针s,我们就可以进行成员变量的修改。通过->来更改。随后执行对象方法study,同样的,[

   ]左边是调用者,右边是消息。[s  study];对象每次创建[Student new]都会分配新的存储空间。而类是只有一个的,内

存中也只有一个类,可是可以有无数个这个类的对象。当第一次使用类创建对象时,会把类加载到内存,内存里的类只

存放方法的声明。下面我们把程序运行下。输出:

  学号为100的梁萧学生正在学习


至此 我们创建了一个完整的类,并且在主函数中调用成功。类和对象的创建完成。

(5)方法与函数的区别:

对象方法都是以-开头的,且声明必须写在@interface和@end之间,定义必须写在@implementation和@end之间。顾

名思义,对象方法只能由对象来调用。而函数是任意调用的,可以写在文件的任意位置,甚至是@implementation和

@end中。并且函数名后面都会加一个()来传入形参。函数和方法是毫无关系的。


(6)方法的声明与调用细节:

由于对象方法只能由对象调用,所以左边放的是指向对象的指针,右边是刚才设计好的方法,传入应有的参数,完成方

法的实现调用。 

(7)类的设计:

1.类的成员变量不仅可以是int,double,也可以是char *(OC中多使用NSString *),甚至是结构体和枚举,这些都可

以当做基本的实例变量。

<span style="font-size:18px;">typedef enum {    SexMan,    Sexwoman} Sex;typedef struct{    int day;    int year;    int month;} Date;@interface Person : NSbject{    Sex _sex;    Date _birthday;}</span>

2.枚举和结构体用作成员变量时,定义名字要做到有意义。枚举{ }内的常量首单词要用枚举名,并且使用驼峰标示命

名。结构体只有在初始化时候才能{  }依次赋值。

3.OC方法中,一个参数对应一个冒号。冒号也是方法名的一部分。

- (void) pingfang;- (void) pingfang:(int)num;

如上,第一个对象方法名称为pingfang,第二个对象方法名称为pingfang:

4.对象方法和类方法是允许同名的,他们是两种不同的方法。

- (void) pingfang;+ (void) pingfang;

(8)匿名对象:不用指针存放对象。单纯就是[[Student new] study],这种方法是不推荐的。因为每一次都是一个新的

new,开辟了一个新的空间存储对象。无法存储或者得到想要的结果。至此,OC的类和方法的基本创建和一些课程知

识点总结完毕。熟练地掌握上面的知识才能更好地完成下面的OC学习。共勉!!

0 0
原创粉丝点击