面向对象编程之OC

面向对象概述

面向对象是一种符合人类思想习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系,在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。

提到面向对象,自然会想到面向过程。面向过程就是分析解决问题所需的步骤,然后用函数把这些步骤一一实现,使用的时候一个一个一次调用就可以了。

面向对象则是把解决的问题按照一定的规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能,这样当应用程序功能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易得到维护。

面向对象的特点主要可以概括为封装性,继承性,和多态性。

1.封装性

封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体的实现细节,这就是封装的思想。譬如,用户使用手机时,只需要会操作手机,而不需要知道手机的内部实现,就可以使用手机的功能。

2.继承性

继承性主要描述的是类与类的关系,通过继承,可以在不必重写类的情况下,对类的功能进行扩展。例如,有一个电脑类,该类描述了电脑的普通特点和功能,而笔记本电脑类中,不仅包含电脑的特性和功能,还应增加笔记本电脑特有的功能,此时笔记本电脑类继承于电脑类,在笔记本电脑类中添加笔记本电脑特有的功能即可。继承不仅增强了代码的复用性,还提高了开发效率,为程序后期的修改补充提供了便利。

3.多态性

多态指一个实体具有多种形态,指的是在一个类中定义的属性和方法被其他类继承之后,它们可以具有不同类型或者表现出不同的行为。

类和对象

面向对象中有两个非常重要的概念:类和对象。对象是面向对象的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另一个新的概念——》类。

类就相当于制造汽车时的图纸,它是用来创建对象的。

还可以将玩具模型看做一个类,将一个个玩具看做对象,从玩具模型和玩具之间的关系便可以看出类与对象之间的关系。类用于描述多个对象的共同特征,它是对象的模板。对象用于描述现实中的个体,它是类的实例,对象是根据类创建的,并且一个类可以对应多个对象。

类的声明和实现

在面向对象的思想中,最核心的就是对象,类就是闯将对象的模板。所以在创建对象之前,首先要定义一个描述此对象的类。

完整地定义一个类包括类的声明和类的实现两部分:

1.类的声明

类的声明用于描述对象的特征和行为。

@interface 类名:父类名

{

   变量的声明;

}

方法声明;

@end

类的声明是以@interface开头,以@end结尾,其中@interface后面需要跟上“类名:父类名”,用于表示创建某个类。在类的声明格式中,变量用于描述对象的特征,它需要用“{}”包围,而方法用于描述对象的行为。需要注意的是,在变量和方法的声明后,都需要跟一个分号,用于表示结束。

例如:

@interface Student:NSObject

{

   @public

       float weight;

       int age;

}

-(void)eat;

@end

其中Student是类名,weight,age是变量,作用域是整个类的范围内,又称之为成员变量;eat是方法,它是可以直接访问成员变量weight,age。

2.类的实现

在声明了类的变量和方法后,还需要对类进行实现。如下:

@implementation 类名

方法的具体实现

@end

类的实现是以@implementation开始,以@end结束。它们中间是方法的具体实现。

                                            类的实现

 #import “Student.h”

@implementation Student

-(void)eat

{

     NSLog(@“年龄为%d岁的人体重为%f公斤”,age,weight);

}

@end

使用Xcode工具创建类时,类的声明和实现是分离开的,它们分别放在不同的文件中。

对象的创建

1.类名 *实例对象=[类名 new];

等号左边的“类名 *实例对象”用于定义一个指针变量,指向类所创建出来的新对象的内存地址,等号右边的“[类名 new]“用于使用new关键字创建对象。等号的作用是将右边创建对象的内存地址赋值给右边的指针变量。

例如创建一个Student类的实例对象

Student *stu=[Student new];

其中stu是指针变量,用于指向创建的Student对象的内存地址,[Student new]用于创建一个新的Student对象

2.类名 *实例对象=[[类名 alloc]init];

等号左边的”类名 *实例对象“同样用与定义一个指针变量,指向类所创建出来的新对象的内存地址,等号右边”[[类名 alloc]init]“则是通知类使用alloc方法为对象分配一块内存空间,并调用init方法为对象初始化。

例如:创建一个Student类的实例对象

Student  *stu=[[Student alloc]init];

上述代码会首先执行”[Student alloc]“用于通知Student类执行alloc方法分配内存,然后调用init方法为对象进行初始化,最后使用Student类的指针变量*stu指向新建的对象的内存地址,至此便创建了一个Student对象。

注意:

在操作对象时,一般都是通过对象指针来实现的,因此,创建对象时,对象的前面一定要加一个”*“号。

虽然创建对象的方式有两种,并且new方法内部也调用了alloc和init方法,但推荐使用第二种方式创建对象。

消息机制

在Objective-C中为了,使用一个类生成实例对象,我们需要向该类发送消息。消息是Objective—C语言中一个非常重要的机制,也是Objective—C区别于其他面向对象编程语言的重要特新。Objective—C中发送消息的基本格式为:

[消息接受者名称 消息名称:消息参数];

其中“消息接受者名称”可以为对象名,也可以是类名,“消息名称”指的是类或对象调用的方法,“消息参数”指的是类或对象调用方法的参数列表。

一般来说,给实例对象发送消息,对应的是调用对象方法;给类发消息,对应的就是调用类方法。

需要注意的是,如果消息没有参数,则消息名称后面没有冒号。如果消息参数有多个,则消息名称和消息参数要交替出现来表达所需的参数。

方法

方法的定义:在OC中,方法是某个类功能的具体实现,它的定义方式与类的定义相似,都需要进行声明和实现,其基本的语法格式如下:

方法类型(返回值类型)方法名:(参数类型1)参数1 :(参数类型2) 参数2..........;

方法实现的语法格式:

方法类型(返回值类型)方法名:(参数类型1)参数1:(参数类型2)参数2......

{

     执行语句

 

 

 

     

   ruturn 返回值;

}

1.方法类型:在OC中,一个类中的方法有两种类型,分别是类方法和对象方法,其中类方法的方法类型用“+”表示,对象方法的方法类型用“-”表示。

2.返回值类型:用于描述方法的返回值的数据类型。

3.参数类型:用于限定调用方法时传入参数的数据类型。

4.参数:是一个变量,用于接收方法传入时的数据。

5.return关键字:用于返回方法指定类型的值,然后结束方法。

6.返回值:被return语句返回的值,该值会返回给方法的调用者。

例如:

创建一个Calculator类。

类Calculator的声明:

#import <Foundation/Foundation>

@interface Calculator:NSObject

-(double) pi;

-(double) square:(double)number;

-(double)sumOfNum1:(double)num1 :(double)num2;

@end

类Calculator类的实现:

#import “Calculator.h”

@implementation Calculator

-(double) pi

{

     return 3.14;

}

-(double) square:(double)number

{

      return number*number;

}

-(double)sumOfNum1:(double)num1 :(double)num2

{

    return num1+num2;

}

@end

在Calculator类中定义了3种方法:分别是pi,square和sumOfNum1,其中,pi方法不带参数,square方法有一个参数,sumOfNum1方法有两个参数。在定义多个参数的时候用冒号分开。

方法的使用

在OC程序中,要实现具体的功能,光靠定义方法是不够的,还需要对方法进行调用。OC中的方法调用是通过给对象发送消息来实现的,每调用一个方法前要向对象传递一个对应的消息,这里的消息指的是方法名和参数。根据传递参数的不同,方法调用的方式也是不一样的。下面针对不同参数的方法调用进行详解。

1.调用无参的方法

调用无参数的方法比较简单,只需将调用者和方法名写在一对方括号中即可。

[实例对象 方法名];

2.调用有参数的方法

如果要调用带参数的方法,则需要在方法名后添加参数,并且参数之间用冒号隔开,其基本语法格式如下:

[实例对象 方法名:参数1,参数2........];

以上面我们声明的类Calculator类为例,在Main文件中调用Calculator中的方法:

#import <Foundation/Foundation.h>

#import  "Calculator.h"

int main (int argc,const char *argc[])

{

          @autoreleasepool

                    {

                           Calculator *c=[[Calculator alloc]init];

                           double a1=[c pi];

                            NSLog(@"pi的值为:%f",a1);

                            double a2=[c square:2.5];

                            NSLog(@"2.5的平方和为%f",a2);

                           double a3=[c sumOfNum1:2.5  :3.6];

                           NSLog(@"2.5+3.6等于%f",a3);

                     }

               return 0;

}

 

posted @ 2017-02-18 14:42  小李少  阅读(323)  评论(0编辑  收藏  举报