面向过程其实是最为实际的一种思考方式,就是算面向对象的方法也是含有面向过程的思想.可以说面向过程是一种基础的方法,它考虑的是实际的实现一般的面向过程是从上往下步步求精.对比面向过程,面向对象的方法主要是把事物给对象化,对象包括属性与行为。当程序规模不是很大时,面向过程的方法还会体现出一种优势,因为程序的流程很清楚,按着模块与函数的方法可以很好的组织.比如拿做饭说这种面向过程吧.粗略的可以将过程拟为:
买菜>淘米>切菜>蒸米>炒菜>上菜
而这5步就是一步一步的完成,它的顺序很重要,你只须一个一个的实现就行了.而如果是用面向对象的方法的话,可能就只抽象出一个做饭的类,它包括这四个方法,但是具体的顺序就不能体现出来。
比较官方的解释就是:“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。C语言就是一门面向过程的语言。
面向对象程序设计模拟自然界认识和处理事物的方法,将数据和对数据的操作方法放在一起,形成一个相对独立的整体——对象(object)(面向对象的程序设计就是由这些对象构造程序),同类对象还可以抽象出共性,形成类(class)。一个类中的数据通常通常只能通过本类提供的方法进行处理,这些方法成为该类与外部的接口。对象之间通过消息(message)进行通讯。
比较官方的解释就是:面向对象程序设计(Object Oriented Programming,OOP)是一种计算机编程架构。OOP的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。OOP=对象+类+继承+多态+消息,其中核心概念是类和对象。C++就是一门面向对象的语言。
类是人们对于客观事物的高度抽象,面向对象方法中的类是一种类型,它是具有相同属性和行为的对象的集合。类是具有相同属性和行为的若干对象的模板。类为属于该类的全部对象提供了抽象的描述,这种描述包括了属性和行为两大部分。
类就是同一类事物的总称,比如我本身这个对象可以讲话,那么基本上所有人都具备这个方法,就将我这一类的对象称为类,类的思想就是这样产生的。更恰当的描述:类就是世间事物的抽象称呼,而对象就是这个事物相对应的实体,人类就是一个类,而你我就是个实例,即对象;这也是为什么人类里面有个类,动物类,植物类,都有一个类,单说一个动物类,我们只能知道是动物,却无法确定是那种动物,而对象就是具体实例化动物。在java语言中,类中对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的,而类包括对象的属性和方法。
现实世界中,任何事物都是对象,对象是事物存在的实体,比如人,桌子,电脑,空气,思想。在计算机的世界中,面对对象程序设计的思想要以对象来思考问题,首先要将现实的实体抽象为对象,然后考虑这个对象所具备的属性和行为,如我们的手机,就是一个对象,将手机抽象为对象,然后识别这个对象的属性,对象具备的属性都是静态属性,比如手机的尺寸,材质,颜色等等,接着识别这个对象的动态行为,如打电话,拍照等等。当识别出这个对象的属性和行为后,这个对象就被定义完成了,然后可以根据再根据各种手机的特点,将这些手机共有的属性和行为封装起来来描述手机,由此可见,类实质上就是封装对象属性和行为的载体,而对象则是类抽出来的一个实例。
封装是面向对象编程的核心思想。将对象的属性和行为封装起来,其载体就是类,类通常对用户隐藏其实现细节,这就是封装的思想,就比如我们使用一个库函数时,我们只需要知道它的作用就可以了,没必要去了解它的内部工作,比如print函数,我们只需要知道用它可以输出我们我们想输出的内容即可,更通俗的讲,我们只需要写完博文点击发布就可以,而不用去管它如何上传至互联网,采用封装的思想保证了类内部数据结构的完整性,使用该类的用户不能轻易地直接操作此数据结构,只能执行类允许公开的数据,这也就避免了外部操作对内部数据的影响,提高了程序的可维护性。
类和类之间具有关系,比如猫类和狗类,测绘人或GISer,当处理一个问题时,我们可以将一些有用的类保留下来,在遇到同样的问题时拿来复用,做一个不恰当的比喻,学电脑的现在要读一篇英文文章,假设他们英语很烂,这时应该想到学英语的人,我们可以使用学英语这类人特殊的属性,我们不看其他属性,我们只使用会英语这门属性,这样就节省了学电脑的还需要学习英语来读英语文章,这样就大大节省了学电脑的时间,这就是继承的基本思想,可见设计软件的代码时可以使用继承思想来缩短软件开发的时间,复用那些以前已经定义好的类,提高系统性能,减少系统在使用过程中出现错误的几率,这就是为什么有些人写完一个功能会把代码保存起来,下次需要这个需求,我们就可以拿来代码直接用。
在java中,人类这种大类被称为父类,而学习电脑,学习英语这几类人被称为子类,他们都是父类分离出来的,他们有着必然的联系,他们都是人。
概念:同一类的对象收到相同消息时,会得到不同的结果。而这个消息是不可预测的。多态,顾名思义,就是多种状态,也就是多种结果。简单的说:就是用基类的引用指向子类的对象。
多态首先是建立在继承的基础上的,先有继承才能有多态。多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。多态成立的另一个条件是在创建子类时候必须使用父类new子类的方式。
多态性是一种通过多种状态或阶段描述相同对象的编程方式。它的真正意义在于:实际开发中,只要关心一个接口或基类的编程,而不必关心一个对象所属于的具体类。
区别是否是多态的关键字在于看对象是否属于同一类型。如果把它们看做同一种类型,调用相同的函数,返回了不同的结果,那么它就是多态,否则,不能称为多态。
多态的含义大约等同于“同一个方法对于不同类型的输入参数均能做出正确的处理过程,并给出人们所期望获得的结果”,也许这正体现了人们对于多态性所能达到的效果所寄予的期望:使程序能够做到越来越智能化,越来越易于使用,越来越能够使设计者透过形形色色的表象看到代码所要触及到的问题本质。
总体是分为通用多态和专用多态:
通用多态:不同的类型值,执行相同的代码。
专用多态:不同的类型值,执行不同的代码。(类似枚举 “什么类型,执行什么操作”)
通用多态分为:参数多态和包含多态
参数多态:参考c++中的template(静态联编时候实现)
包含多态:可以理解为abstract functions,interface的方法(动态联编时候实现,)
专用多态:强制多态和重载多态
强制多态:可以理解为类型的隐式转换(静态联编时候实现)
重载多态:参考C++中的函数重载的理解(静态联编时候实现)
对象通过相互间传递消息来相互作用和通信,一个消息由三部分组成:
1. 接受消息的对象
2. 接收对象要采取的方法
3. 方法需要的参数
//在对象外,想要对象执行执行它的某个方法(函数),就需要向其发送一条消息。
//例子:
class A
{
public:
void fun(){}
};
int main()
{
A a;
a.fun();//这条语句就是向a对象发送的一个消息,请求它执行它的fun方法(函数)
}
对象是类的实例。尽管对象的表示在形式上与一般数据类型十分相似,但是它们之间存在一种本质区别:对象之间通过消息传递方式进行通信。 消息传递原是一种与通信有关的概念,OOP使得对象具有交互能力的主要模型就是消息传递模型。对象被看成用传递消息的方式互相联系的通信实体,它们既可以接收可以拒绝外界发来的消息。一般情况下,对象接收它能够识别的消息,拒绝它不能识别消息。对于一个对象而言,任何外部的代码都不能以任何不可预知或事先不允许的方式与这个对象进行交互。
发送一条消息至少应给出一个对象的名字和要发给这个对象的那条消息的名字。经常,消息的名字就是这个对象中外界可知的某个方法的名字。在消息中,经常还有一组数(也就是那个方法所要求的参数),将外界的有关信息传给这个对象。
对于一个类来说,它关于方法界面的定义规定了实例的消息传递协议,而它本身身定了消息传递的合法范围。由于类是先于对象构造而成的,所以一个类为它的实例提了可以预知的交互方式。例如,假设msg是类Manager的一个实例(或对象其中包含getMessage方法),当外界要求把这个对象所代表的那位经理的级别改变为2时,就应以下面的方式向这个对象发出一条消息:
msg.getMessage("helo");
在C++中,所谓继承就是在一个已存在的类的基础上建立一个新的类.已存在的类(例如马)称为基类(base class )或父类(father class )。新建的类(例如公马)称为派生类(derived class )或子类(son class )。
一个新类从已有的类那里获得其已有特性,这种现象称为类的继承.通过继承,一个新建子类从已有的父类那里获得父类的特性。从另一角度说,从已有的类(父类)产生一个新的子类,称为类的派生。
被继承的类一般称为“超类”或“父类”,继承的类称为“子类”。当子类继承超类时,不必写出全部的实例变量和方法,只需声明该类继承了的已定义的超类的实例变量和方法即可。超类、子类是继承中非常重要的概念,它们形象地描述了继承的层次关系。继承节省了定义新类的大量工作,可以方便地重用代码。例如,把汽车作为父类,当创建汽车的子类轿车时,品牌、价格、最高时速等属性会自动地被定义,调用刹车方法时会自动调用在汽车类中定义的刹车方法。但一个子类不必非要使用继承下来的属性和方法,一个子类可以选择覆盖已有的属性和方法,或添加新的属性和方法。由继承产生的子类比超类具有更多的特征,因此有时很容易混淆二者的概念。通常情况下,每个子类的对象“是”它的超类的对象。一个超类可以有很多个子类,所以超类的集合通常比它的任何一个子类集合都大。例如交通工具包含飞机、汽车、自行车等,而汽车子类只是交通工具中的一个小子集。
重载,从简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者重载方法。在Java中同一个类中的2个或2个以上的方法可以有同一个名字,只要它们的参数声明不同即可。这种情况下,该方法就被称为重载,这个过程称为方法重载;
重载的好处就是不用为了对不同的参数类型或参数个数,而写多个函数,多个函数只用同一个名字,但参数表,即参数的个数或(和)数据类型必须不同;调用的时候,虽然方法名字相同,但是根据参数表可以自动调用对应的函数。我们可以发现他使用很多的方法重载,这样我们在调用的时候,就不需要记那么多的方法名称,而是知道了方法的功能就可以直接的给他传递不同的参数,编译器会明确的知道我们调用了哪一个方法。重载比if...else要优雅,减少了大量的if...else代码。
程序中类的继承特性可以产生一个子类,子类继承父类就拥有了父类的非私有的属性(方法和变量),在子类中可以增加自己的属性(方法和变量),同时也可以对父类中的方法进行扩展,以增强自己的功能,这样就称之为重写,也称为复写或者覆盖。
文章是由博主在网络搜索整理以及自己思考的结果,部分优秀的解释博主选择了保留,若侵犯到了您的权益,请私信留言,博主会妥善修改。