面向对象概述

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

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

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

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

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;

}

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

  1. PHP面向对象编程之深入理解方法重载与方法覆盖(多态)

    这篇文章主要介绍了PHP面向对象编程之深入理解方法重载与方法覆盖(多态)的相关资料,需要的朋友可以参考下: 什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态" ...

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

    介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...

  3. python基础-面向对象编程之继承

    面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...

  4. python基础-面向对象编程之封装、访问限制机制和property

    面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...

  5. python基础-面向对象编程之反射

    面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...

  6. python基础-面向对象编程之多态

    面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...

  7. python基础-面向对象编程之组合

    面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...

  8. 浅谈:javascript的面向对象编程之具体实现

    下面的javascript代码都是需要使用jQuery插件来做的.希望大家可以搭建好工作环境 首先我们来做一个练习:在一个删除的超链接中添加一个提示信息,提示是否确认删除. 一般情况下我们都会这么做 ...

  9. 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型

    前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.

随机推荐

  1. Android 引用外部字体

    在Android中,加载外部字体是非常容易的! 步骤如下: 1. 创建新的Android工程: 2. 在工程下的assets文件夹下新建名字为fonts的文件夹(名字可以任意选取),把所有的外部字体文 ...

  2. AWT是Java最早出现的图形界面,但很快就被Swing所取代。

    Module  11 Swing AWT是Java最早出现的图形界面,但很快就被Swing所取代. Swing才是一种真正的图形开发. AWT在不同平台所出现的界面可能有所不同:因为每个OS都有自己的 ...

  3. (原)ffmpeg过滤器开发和理解

    最近学习了ffmpeg关于filter过滤器的开发,关于中间的几个相关概念,我们先放在简单介绍一下: AVFilterGraph:几乎完全等同与directShow中的fitlerGraph,代表一串 ...

  4. 搭建Airflow数据流调度器

    服务器使用的是centos系统,需要安装好pip和setuptools,同时注意更新安装的版本 接下来参考安装好Airflow Airflow 1.8 工作流平台搭建 http://blog.csdn ...

  5. PXE:终于成功启动 fedora live 了!

    default menu.c32 timeout 1 label fedora29-live menu label fedora29-live from ftp kernel fedora29live ...

  6. 64位 windows10,安装配置MYSQL8.0.13

    MySQL的安装配置过程,一查网上一大堆,但是每个人在安装配置的过程中都会碰到一些问题,因为安装的版本不一样,有些命令可能就不适用了.所以安装之前一定先确认好你的版本号. 下面开始安装MYSQL8.0 ...

  7. VxWorks信号量问题

    VxWorks主要提供如下API进行信号量的创建.获取和释放:   参数1:SEM_Q_PRIORITY,SEM_Q_FIFO SEM_Q_PRIORITY(值为0x1):需要获取该信号量的任务基于优 ...

  8. 【面试题】java面试题整理(有空再贴答案)

    面试题+基础 各家的面试题其实都大同小异, 掌握基础和原理,走到哪都不怕. 基础 leetcode上有一些总结,star数非常高了.贴上url https://github.com/CyC2018/C ...

  9. mysql按位的索引判断位的值

    DELIMITER $$ DROP FUNCTION IF EXISTS `value_of_bit_index`$$/*计算数字的某个位的值*/CREATE FUNCTION `value_of_b ...

  10. 删除或修改本地Git保存的账号密码

    win10 系统下进入 控制面板 > 用户帐户 > 管理你的凭据 选择 [Windows 凭据] git 保存的用户信息在普通凭据列表里 >>编辑>>>完成