面向对象概述
面向对象是一种符合人类思想习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系,在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。
提到面向对象,自然会想到面向过程。面向过程就是分析解决问题所需的步骤,然后用函数把这些步骤一一实现,使用的时候一个一个一次调用就可以了。
面向对象则是把解决的问题按照一定的规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能,这样当应用程序功能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易得到维护。
面向对象的特点主要可以概括为封装性,继承性,和多态性。
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;
}