面向对象编程之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;

}

时间: 2024-10-07 05:32:17

面向对象编程之OC的相关文章

OOP面向对象编程之java打飞机游戏

#写在前面 继上一篇OOP面向对象编程之俄罗斯方块项目实现过程,OOP面向对象编程之java打飞机游戏,其实写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习(顺便做50个深蹲,嘿嘿,平时干嘛去了),看图:   #完整代码   敌飞机 package com.tarena.fly; import java.util.Random; /** * 敌飞机: 是飞行物,也是敌人 */ public class Airplane extends FlyingObject imp

深入理解JavaScript系列(17):面向对象编程之概论

介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基本关系 - 继承)之间的关系是如何,也可以在讨论中使用(我希望将消除之前对于JavaScript中OOP的一些概念歧义). 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-7-1-oop-general-theory/ 概论.范式与思想 在进行E

JS面向对象编程之:封装、继承、多态

最近在实习公司写代码,被隔壁的哥们吐槽说,代码写的没有一点艺术.为了让我的代码多点艺术,我就重新温故了<javascript高级程序设计>(其中几章),然后又看了<javascript设计模式>,然后觉得要写点心得体会,来整理自己所学的吧.以下是我个人见解,错了请轻喷,欢迎指出错误,乐于改正. 一.封装 (1)封装通俗的说,就是我有一些秘密不想让人知道,就通过私有化变量和私有化方法,这样外界就访问不到了.然后如果你有一些很想让大家知道的东西,你就可以通过this创建的属性看作是对象

JS面向对象编程之对象(简化版)

上次网上看了一篇这个文章,然后乱七八糟晕头转向把我晕的够呛.看了半天没找到错的地方但是浏览器Hello world就是没有定义...我也是醉了,最后发现我认为是废话的话一句话竟然有用!!!所以我还是简化一下,大家看着都舒服 首先先实例化一个函数 function HelloWorld(){    alert('hello world!');} 然后针对这个函数给他new一个 function _test(){    var obj = new HelloWorld();} 然后调用方法可以使用t

lua面向对象编程之点号与冒号的差异详细比较

首先,先来一段在lua创建一个类与对象的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Class = {} Class.__index = Class function Class:new(x,y)     local temp = {}     setmetatable(temp, Class)     temp.x = x     temp.y = y     return temp end function Class:test()

scala学习笔记-面向对象编程之Trait(13)

将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念 2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 3 // 在triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现即可 4 // 类可以使用extends关键字继承trait,注意,这里不是implement,而是extends,在scala中没有implement的概念,无论继承类还是trait,统一都是extends 5 // 类继承tra

3. 第一章:C#面向对象编程之继承和多态

第一章:C#面向对象编程 第二节:继承和多态 继承可以让class具有一种特殊的能力,即实现class本身定义的所有功能外,还可以对父类(或称为基类.超类)的某些属性和功能进行扩展,这样的类我们称之为子类(或派生类). 继承有如下的几个规则: 1. 可传递性: 如: C是B的子类,B是A的子类,那么C会同时继承B和A:(object为所有类的基类) 2. 唯扩展性: 子类应是对父类的扩展,而不能在子类除去父类里面的定义: 3. 构造函数和析构函数不能被继承: 除去构造函数和析构函数不能被继承,其

Java面向对象-面向对象编程之基本概念

面向对象这个概念,每本书上的说法定义很多. 我自己根据我的经验,自己归档总结了下, 所谓面向对象,就是 以基于对象的思维去分析和解决问题,万物皆对象: 面向对象经常和面向过程放一起讨论: 这里举例, 比如要造一辆自行车,假如以面向过程的思维搞,张三先搞轮子, 李四再搞车架,王五再搞链条,赵六再搞脚踏板...最终拼拼凑凑,搞出一辆勉强能骑的车: 但是,假如某个部件要调整下,其他部件要调整的东西太多了,有时候搞不好还得重头开始搞: 面向过程的缺点就是 扩展性 维护性差,但是也是有优点的,就是速度快:

Java面向对象编程之继承(二)

在上一篇博客中,我们已经了解继承的基本概念和语法,那么今天我们就来聊一聊有关于继承的其他东西. 让我们来了解一下什么是方法重载(overload)和方法覆盖(override) 方法重载(overload) 对于类的的方法(包括从父类中继承的方法),如果有两个方法的方法名相同,但参数不一致,那么可以说,一个方法是另一个方法的重载方法. 重载方法必须满足以下条件: 方法名相同 方法的参数类型.个数.顺序至少有一项不相同 方法的返回类型可以不相同 方法的修饰符可以不相同 其中,参数的类型.个数和顺序