面向对象编程之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;
}
面向对象编程之OC的更多相关文章
- PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
这篇文章主要介绍了PHP面向对象编程之深入理解方法重载与方法覆盖(多态)的相关资料,需要的朋友可以参考下: 什么是多态? 多态(Polymorphism)按字面的意思就是"多种状态" ...
- 深入理解JavaScript系列(17):面向对象编程之概论
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...
- python基础-面向对象编程之继承
面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...
- python基础-面向对象编程之封装、访问限制机制和property
面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...
- python基础-面向对象编程之反射
面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...
- python基础-面向对象编程之多态
面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...
- python基础-面向对象编程之组合
面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...
- 浅谈:javascript的面向对象编程之具体实现
下面的javascript代码都是需要使用jQuery插件来做的.希望大家可以搭建好工作环境 首先我们来做一个练习:在一个删除的超链接中添加一个提示信息,提示是否确认删除. 一般情况下我们都会这么做 ...
- 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型
前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.
随机推荐
- 手动安装mysql
需要在本机(mac)上装个mysql,看到压缩版的体积最小,结果进入了手工安装的坑(正常有界面可以安装,但安装目录将是/usr/local/mysql),既然入了坑就填上吧. 1.解压到自己选择的目录 ...
- JDK 自带的观察者模式源码分析以及和自定义实现的取舍
前言 总的结论就是:不推荐使用JDK自带的观察者API,而是自定义实现,但是可以借鉴其好的思想. java.util.Observer 接口源码分析 该接口十分简单,是各个观察者需要实现的接口 pac ...
- dos 打开计算机管理
一. 首先打开[运行]程序:二. 运行中输入‘CMD’:三. 然后在上面输入‘compmgmt.msc’,就可以打开“计算机管理”命令了.
- Java对象序列化和反序列化的工具方法
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- POI导出Excel发现不可读取的内容
环境说明:MyEclipse Tomcat7.0 通过后台查询数据,导出Excel在打开时会出现以下提示: 点击否,则不显示任何内容,点击是,弹出 查看修改记录为: 通过WPS打开不会出现任何提示,可 ...
- 【Linux常用工具】
tmux - 终端分屏工具 man - Help cat/more/less - 文件阅读 less还具有字符串搜索功能
- 记录一份Oracle 正确的监听配置文件listener.ora与tnsnames.ora
一.前言 昨天中午接到领导指示,有其他组的负责人B在厄瓜多尔演示他们组的产品,然后我们组的负责人就想说也在那边搭一套环境,(北美那边的亚马逊云环境),让B帮忙演示下我们的系统. 于是,开始了一个比较曲 ...
- PHP异步请求之fsockopen()方法详解
正常情况下,PHP执行的都是同步请求,代码自上而下依次执行,但有些场景如发送邮件.执行耗时任务等操作时就不适用于同步请求,只能使用异步处理请求. 场景要求: 客户端调用服务器a.php接口,需要执行一 ...
- Ubuntu下安装LNMP
1.安装mysql sudo apt-get install mysql-server mysql-client 2.安装nginx sudo apt-get install nginx 安装完后重启 ...
- 25.redux回顾,redux中的action函数异步
回顾:Redux: 类似于 Vuex 概念:store/reducer/action action:动作 {type,.....} 一定要有type 其他属性不做限制 reducer:通过计算产生st ...