面向对象程序设计的三大特征是多态(Polymorphism)、继承(Inheritance)、封装(Encapsulation)。
1、多态
多态核心的思想就是,父类的引用能够指向子类的对象,或者接口类型的引用能够指向实现该接口的类的实例。多态会这样的原因是因为子类就是父类。
2、继承
Java是单继承的,这一点和C++有所不同,这也就意味着,一个类只能继承于一个类,被继承的类叫父类,或者是叫基类baseclass,继承的类叫子类。
Java当中的继承使用关键字extends。可是,一个类能够实现多个接口,多个接口之间用逗号进行分割。实现接口使用关键字implements。
3、封装(Encapsulation)
封装比较的简单,类包含了方法和数据,将方法和数据放在一个类当中,就构成了封装。封装的优点:将变化隔离,便于使用,提高重用性,提高安全性;封装的缺点:将变量等使用private修饰,或者封装进方法内,使其不能直接被访问,增加了访问步骤与难度!
面向对象程序设计的六大基本原则:
1、单一职责原则
不要存在多于一个导致类变更的原因,即一个类只承担一个职责。
2、开放-封闭原则
对扩展开放,对修改封闭。无论模块多么封闭,都会存在一些无法对之封闭的变化,既然不能完全封闭,我们必须对于自己设计的模块应该对哪种变化封闭做出选择,必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离这些变化。
3、迪米特原则
一个对象应该对其他对象有最少的了解,减少类与类之间的耦合。如果两个类不必彼此通信,那么这两个类就不应当发生直接的相互作用。类与类之间的耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及。
4、依赖倒转原则
上层模块不要依赖底层模块,它们都要依赖于抽象。抽象不能依赖于细节,细节要依赖于抽象。面向接口编程,不要面向实现编程。
5、里氏替换原则
子类型必须能够替换掉它们的父类型。只有当子类可以替换掉父类,软件单位的功能不受影响时,父类才能真正的被复用,而子类也能够在父类的基础上增加新的行为。
6、接口隔离原则
客户端不应该依赖于它不需要的接口,一个类对一个类的依赖应该建立在最小的接口上。不要让与自己无关的修改影响到自己功能模块的变化。
封装性、继承性、多态性。
1、封装性:
具备封装性(Encapsulation)的面向对象编程隐藏了某一方法的具体运行步骤,取而代之的是通过消息传递机制发送消息给它。封装是通过限制只有特定类的对象可以访问这一特定类的成员,而它们通常利用接口实现消息的传入传出。
通常来说,成员会依它们的访问权限被分为3种:公有成员、私有成员以及保护成员。有些语言更进一步:Java可以限制同一包内不同类的访问;C#和VB.NET保留了为类的成员聚集准备的关键字:internal(C#)和Friend(VB.NET);Eiffel语言则可以让用户指定哪个类可以访问所有成员。
具备封装性(Encapsulation)的面向对象程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。
2、继承性:
继承性是面向对象技术中的另外一个重要特点,其主要指的是两种或者两种以上的类之间的联系与区别。继承,顾名思义,是后者延续前者的某些方面的特点,而在面向对象技术则是指一个对象针对于另一个对象的某些独有的特点、能力进行复制或者延续。
如果按照继承源进行划分,则可以分为单继承(一个对象仅仅从另外一个对象中继承其相应的特点)与多继承(一个对象可以同时从另外两个或者两个以上的对象中继承所需要的特点与能力,并且不会发生冲突等现象)。
如果从继承中包含的内容进行划分,则继承可以分为四类,分别为取代继承(一个对象在继承另一个对象的能力与特点之后将父对象进行取代);
包含继承(一个对象在将另一个对象的能力与特点进行完全的继承之后,又继承了其他对象所包含的相应内容,结果导致这个对象所具有的能力与特点大于等于父对象,实现了对于父对象的包含)、受限继承、特化继承。
3、多态性:
从宏观的角度来讲,多态性是指在面向对象技术中,当不同的多个对象同时接收到同一个完全相同的消息之后,所表现出来的动作是各不相同的,具有多种形态。
从微观的角度来讲,多态性是指在一组对象的一个类中,面向对象技术可以使用相同的调用方式来对相同的函数名进行调用,即便这若干个具有相同函数名的函数所表示的函数是不同的。
扩展资料:
面向对象编程语言
支持部分或绝大部分面向对象特性的语言即可称为基于对象的或面向对象的语言。Simula (1967)被视为第一个具有面向对象特性的语言。早期,完全面向对象的语言主要包括Smalltalk等语言,目前较为流行的语言中有Java、C#、Eiffel等。
随着软件工业的发展,比较早的面向过程的语言在近些年的发展中也纷纷吸收了许多面向对象的概念,比如C→C++,C→Objective-C,BASIC→Visual Basic→Visual Basic .NET,Pascal→Object Pascal,Ada→Ada95。
“纯粹”的面向对象语言, 因为所有的东西都是由对象所组成,例如:Eiffel,Emerald,JADE,Obix,Ruby,Scala,Smalltalk,Self。
脚本中的OOP
近年来,面向对象的程序设计越来越流行于脚本语言中。Python和Ruby是创建在OOP原理的脚本语言,Perl和PHP亦分别在Perl 5和PHP 4时加入面向对象特性。
面向对象程序设计的三大特点是封装、继承和多态。�0�2面向对象程序设计中的基本概念“面向对象”作为一个术语,在不同的人群中有着不同的解释。因此,了解一些在面向对象程序设计中广泛应用的概念是必须的。本节我们讨论以下这些内容:
1、对象(Object)
2、类(Class)
3、数据抽象(Data abstraction)
4、继承(Inheritance)
5、动态绑定(Dynamic binding)
6、数据封装(Data encapsulation)
7、多态性(Polymorphism)
8、消息传递(Message passing)
对象
在一个面向对象的系统中,对象是运行期的基本实体。它可以用来表示一个人或者说一个银行帐户,一张数据表格,或者其它什么需要被程序处理的东西。它也可以用来表示用户定义的数据,例如一个向量,时间或者列表。在面向对象程序设计中,问题的分析一般以对象及对象间的自然联系为依据。如前所述,对象在内存中占有一定空间,并且具有一个与之关联的地址,就像Pascal中的record和C中的结构一样。
当一个程序运行时,对象之间通过互发消息来相互作用。例如,程序中包含一个“customer”对象和一个“account”对象,而customer对象可能会向account对象发送一个消息,查询其银行帐目。每个对象都包含数据以及 *** 作这些数据的代码。即使不了解彼此的数据和代码的细节,对象之间依然可以相互作用,所要了解的只是对象能够接受的消息的类型,以及对象返回的响应的类型,虽然不同的人会以不同的方法实现它们。
类
我们刚才提到,对象包含数据以及 *** 作这些数据的代码。一个对象所包含的所有数据和代码可以通过类来构成一个用户定义的数据类型。事实上,对象就是类类型(class type)的变量。一旦定义了一个类,我们就可以创建这个类的多个对象,每个对象与一组数据相关,而这组数据的类型在类中定义。因此,一个类就是具有相同类型的对象的抽象。例如,芒果、苹果和桔子都是fruit类的对象。类是用户定义的数据类型,但在一个程序设计语言中,它和内建的数据类型行为相同。比如创建一个类对象的语法和创建一个整数对象的语法一模一样。如果fruit被定义为一个类,那么语句
fruit mango
就创建了一个fruit类的对象mango。
数据抽象和封装
把数据和函数包装在一个单独的单元(称为类)的行为称为封装。数据封装是类的最典型特点。数据不能被外界访问,只能被封装在同一个类中的函数访问。这些函数提供了对象数据和程序之间的接口。避免数据被程序直接访问的概念被称为“数据隐藏”。
抽象指仅表现核心的特性而不描述背景细节的行为。类使用了抽象的概念,并且被定义为一系列抽象的属性如尺寸、重量和价格,以及 *** 作这些属性的函数。类封装了将要被创建的对象的所有核心属性。因为类使用了数据抽象的概念,所以它们被称为抽象数据类型(ADT)。
封装
封装机制将数据和代码捆绑到一起,避免了外界的干扰和不确定性。它同样允许创建对象。简单的说,一个对象就是一个封装了数据和 *** 作这些数据的代码的逻辑实体。
在一个对象内部,某些代码和(或)某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
继承
继承是可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。例如,知更鸟属于飞鸟类,也属于鸟类。就像图5中描绘的那样,这种分类的原则是,每一个子类都具有父类的公共特性。
在OOP中,继承的概念很好的支持了代码的重用性(reusability),也就是说,我们可以向一个已经存在的类中添加新的特性,而不必改变这个类。这可以通过从这个已存在的类派生一个新类来实现。这个新的类将具有原来那个类的特性,以及新的特性。而继承机制的魅力和强大就在于它允许程序员利用已经存在的类(接近需要,而不是完全符合需要的类),并且可以以某种方式修改这个类,而不会影响其它的东西。
注意,每个子类只定义那些这个类所特有的特性。而如果没有按级分类,每类都必须显式的定义它所有的特性。
多态
多态是OOP的另一个重要概念。多态的意思是事物具有不同形式的能力。举个例子,对于不同的实例,某个 *** 作可能会有不同的行为。这个行为依赖于所要 *** 作数据的类型。比如说加法 *** 作,如果 *** 作的数据是数,它对两个数求和。如果 *** 作的数据是字符串,则它将连接两个字符串。
图6演示了一个函数处理不同数量、不同类型的参数。就像某个单词在不同的上下文中具有不同的含义。
多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体 *** 作不同,但通过一个公共的类,它们(那些 *** 作)可以通过相同的方式予以调用。多态在实现继承的过程中被广泛应用。
面向对象程序设计语言支持多态,术语称之为“one interface multiple method(一个接口,多个实现)”。简单来说,多态机制允许通过相同的接口引发一组相关但不相同的动作,通过这种方式,可以减少代码的复杂度。在某个特定的情况下应该作出怎样的动作,这由编译器决定,而不需要程序员手工干预。
在多函数程序中,许多重要的数据被声明为全局变量,这样它们才可以被所有的函数访问。每个函数又可以具有它自己的局部变量。全局变量很容易被某个函数不经意之间改变。而在一个大程序中,很难分辨每个函数都使用了哪些变量。如果我们需要修改某个外部数据的结构,我们就要修改所有访问这个数据的函数。这很容易导致bug的产生。
在结构化程序设计中,另一个严重的缺陷是不能很好的模拟真实世界的问题。这是因为函数都是面向过程的,而不是真正的对应于问题中的各个元素。
面向过程的程序设计的一些特点如下:
·强调做(算法);
·大程序被分隔为许多小程序,这些小程序称为函数;
·大多数函数共享全局数据;
·数据开放的由一个函数流向另一个函数。函数把数据从一种形式转换为另一种形式。
采用由上至下的程序设计方法。
动态绑定
绑定指的是将一个过程调用与相应代码链接起来的行为。动态绑定的意思是,与给定的过程调用相关联的代码只有在运行期才可知。它与多态和继承的联系极为紧密。一个多态引用的函数调用决定于这个引用的动态类型。
考虑图6中的“draw”方法。通过继承,每个对象都具备了这个过程。但是,对于不同的对象它的算法是不同的,因此,draw过程必须在每一个类中重新定义。在运行期,当前引用对象所对应的代码将被调用。
消息传递
一个面向对象的程序由许多对象组成,这些对象之间需要相互沟通。因此,在面向对象程序设计语言中,程序设计的主要步骤如下:
1、创建类,这些类定义了对象及其行为;
2、由类定义创建对象;
3、建立对象之间的通讯。
对象之间通过收发信息相互沟通,这一点类似于人与人之间的信息传递。信息传递的概念使得真实世界的直接模拟更易于和建立系统交流。
对于某个特定对象来说,消息就是请求执行某个过程,因此,消息的接收对象会调用一个函数(过程),以产生预期的结果。传递的消息的内容包括接收消息的对象的名字,需要调用的函数的名字,以及必要的信息。
对象就有一个生命周期。它们可以被创建和销毁。只要对象正处于其生存期,就可以与其进行通讯。
OOP的优点
OOP具有许多优点,无论是对于程序设计者或者用户来说都是如此。面向对象为软件产品扩展和质量保证中的许多问题提供了解决办法。这项技术能够大大提高程序员的生产力,并可提高软件的质量以及降低其维护费用。其主要的优点陈列于下:
1、通过继承,我们可以大幅减少多余的代码,并扩展现有代码的用途;
2、我们可以在标准的模块上(这里所谓的“标准”指程序员之间彼此达成的协议)构建我们的程序,而不必一切从头开始。这可以减少软件开发时间并提高生产效率;
3、数据隐藏的概念帮助程序员们保护程序免受外部代码的侵袭;
4、允许一个对象的多个实例同时存在,而且彼此之间不会相互干扰;
5、允许将问题空间中的对象直接映射到程序中;
6、基于对象的工程可以很容易的分割为独立的部分;
7、以数据为中心的设计方法允许我们抓住可实现模型的更多细节;
8、面向对象的系统很容易从小到大逐步升级;
9、对象间通讯所使用的消息传递技术与外部系统接口部分的描述更简单;
10、更便于控制软件复杂度。
当需要将以上所说的所有特性有机的结合于一个面向对象系统中,它们之间的相对重要性就取决于工程的类型和程序员的喜好。为了获得上述的某些优势,必须考虑很多事情。例如,对象库必须可以被重用。技术还在不停的发展,现有的产品也会很快的更新换代。如果重用没有能够实现,那么就需要进行严格的控制和管理。
易于使用的开发软件往往难以编写。面向对象程序设计工具有望解决这个问题。
面向对象程序设计语言
面向对象技术并不是某个特定语言的特权。如同结构化程序设计一样,OOP概念可以在很多语言比如C和Pascal中实现。但是,当程序越来越大时,程序设计工作会变得拙劣而混乱。而一个支持OOP概念的程序设计语言则可以让一切变得简单。
一个语言必须支持几个主要的OOP概念才能称其是面向对象的。根据所支持的OOP特性,语言可以分为以下两类:
1、基于对象的程序设计语言;
2、面向对象的程序设计语言。
基于对象的程序设计语言仅支持封装和对象辨识。
一个面向对象的程序设计语言所要支持的重要特性如下:
·数据封装
·数据隐藏和访问机制
·对象的自动初始化和清除
· *** 作符重载
支持对象风格程序设计的语言称为基于对象的程序设计语言。它们不支持继承和动态绑定。
Ada就是一个典型的基于对象的程序设计语言。
面向对象的程序设计不仅仅包含基于对象程序设计的特性,还支持继承和动态绑定。
OOP的应用
OOP最有前途的应用领域如下:
1、实时系统;
2、仿真和建模;
3、面相对象数据库;
4、超文本、超媒体和扩展文本;
5、AI和专家系统;
6、神经网络和并行程序设计;
7、决策支持和办公自动化系统;
8、CIM/CAM/CAD系统。�0�2
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)