面向对象思想
面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。这些程序设计语言可以归纳为以下几类:系统中一切皆为对象;对象是属性及其操作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。
从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。
从世界观的角度可以认为:面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。这样建立起来的系统才能符合现实世界的本来面目。
从方法学的角度可以认为:面向对象的方法是面向对象的世界观在开发方法中的直接运用。它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。
面向对象
面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
起初,“面向对象”是专指在程序设计中采用封装、继承、抽象等设计方法。可是,这个定义显然不能再适合现在情况。面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)。许多有关面向对象的文章都只是讲述在面向对象的开发中所需要注意的问题或所采用的比较好的设计方法。看这些文章只有真正懂得什么是对象,什么是面向对象,才能最大程度地对自己有所裨益。这一点,恐怕对初学者甚至是从事相关工作多年的人员也会对它们的概念模糊不清。
传统开发方法存在问题
1.软件重用性差
重用性是指同一事物不经修改或稍加修改就可多次重复使用的性质。软件重用性是软件工程追求的目标之一。
2.软件可维护性差
软件工程强调软件的可维护性,强调文档资料的重要性,规定最终的软件产品应该由完整、一致的配置成分组成。在软件开发过程中,始终强调软件的可读性、可修改性和可测试性是软件的重要的质量指标。实践证明,用传统方法开发出来的软件,维护时其费用和成本仍然很高,其原因是可修改性差,维护困难,导致可维护性差。
3.开发出的软件不能满足用户需要
用传统的结构化方法开发大型软件系统涉及各种不同领域的知识,在开发需求模糊或需求动态变化的系统时,所开发出的软件系统往往不能真正满足用户的需要。
用结构化方法开发的软件,其稳定性、可修改性和可重用性都比较差,这是因为结构化方法的本质是功能分解,从代表目标系统整体功能的单个处理着手,自顶向下不断把复杂的处理分解为子处理,这样一层一层的分解下去,直到仅剩下若干个容易实现的子处理功能为止,然后用相应的工
具来描述各个最低层的处理。因此,结构化方法是围绕实现处理功能的“过程”来构造系统的。然而,用户需求的变化大部分是针对功能的,因此,这种变化对于基于过程的设计来说是灾难性的。用这种方法设计出来的系统结构常常是不稳定的,用户需求的变化往往造成系统结构的较大变化,从而需要花费很大代价才能实现这种变化。
面向对象的基本概念
(1)对象。
对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
(2)对象的状态和行为。
对象具有状态,一个对象用数据值来描述它的状态。
对象还有操作,用于改变对象的状态,操作就是对象的行为。
对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中
(3)类。
具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
(4)类的结构。
在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。
①一般——具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。
②整体——部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。
(5)消息和方法。
对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。
面向对象的特征
(1)对象唯一性。
每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。
(2)分类性。
分类性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
(3)继承性。
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
继承性是面向对象程序设计语言不同于其它语言的最重要的特点,是其他语言所没有的。
在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。
在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。
在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重性。
采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。
(4)多态性(多形性)
多态性使指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
多态性允许每个对象以适合自身的方式去响应共同的消息。
多态性增强了软件的灵活性和重用性。
面向对象的要素
(1)抽象
抽象是指强调实体的本质、内在的属性。在系统开发中,抽象指的是在决定如何实现对象之前的对象的意义和行为。使用抽象可以尽可能避免过早考虑一些细节。
类实现了对象的数据(即状态)和行为的抽象。
(2)封装性(信息隐藏)
封装性是保证软件部件具有优良的模块性的基础。
面向对象的类是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。
对象是封装的最基本单位。封装防止了程序相互依赖性而带来的变动影响。面向对象的封装比传统语言的封装更为清晰、更为有力。
(3)共享性
同一类中的共享。同一类中的对象有着相同数据结构。这些对象之间是结构、行为特征的共享关系。
在同一应用中共享。在同一应用的类层次结构中,存在继承关系的各相似子类中,存在数据结构和行为的继承,使各相似子类共享共同的结构和行为。使用继承来实现代码的共享,这也是面向对象的主要优点之一。
在不同应用中共享。面向对象不仅允许在同一应用中共享信息,而且为未来目标的可重用设计准备了条件。通过类库这种机制和结构来实现不同应用中的信息共享。
4.强调对象结构而不是程序结构
面向对象的开发方法
目前,面向对象开发方法的研究已日趋成熟,国际上已有不少面向对象产品出现。面向对象开发方法有Coad方法、Booch方法和OMT方法等。
1.Booch方法
Booch最先描述了面向对象的软件开发方法的基础问题,指出面向对象开发是一种根本不同于传统的功能分解的设计方法。面向对象的软件分解更接近人对客观事务的理解,而功能分解只通过问题空间的转换来获得。
2.Coad方法
Coad方法是1989年Coad和Yourdon提出的面向对象开发方法。该方法的主要优点是通过多年来大系统开发的经验与面向对象概念的有机结合,在对象、结构、属性和操作的认定方面,提出了一套系统的原则。该方法完成了从需求角度进一步进行类和类层次结构的认定。尽管Coad方法没有引入类和类层次结构的术语,但事实上已经在分类结构、属性、操作、消息关联等概念中体现了类和类层次结构的特征。
3.OMT方法
OMT方法是1991年由James Rumbaugh等5人提出来的,其经典著作为“面向对象的建模与设计”。
该方法是一种新兴的面向对象的开发方法,开发工作的基础是对真实世界的对象建模,然后围绕这些对象使用分析模型来进行独立于语言的设计,面向对象的建模和设计促进了对需求的理解,有利于开发得更清晰、更容易维护的软件系统。该方法为大多数应用领域的软件开发提供了一种实际的、高效的保证,努力寻求一种问题求解的实际方法。
4.UML(Unified Modeling Language)语言
软件工程领域在1995年~1997年取得了前所未有的进展,其成果超过软件工程领域过去15年的成就总和,其中最重要的成果之一就是统一建模语言(UML)的出现。UML将是面向对象技术领域内占主导地位的标准建模语言。
UML不仅统一了Booch方法、OMT方法、OOSE方法的表示方法,而且对其作了进一步的发展,最终统一为大众接受的标准建模语言。UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它融入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发全过程。
面向对象的模型
对象模型
对象模型表示了静态的、结构化的系统数据性质,描述了系统的静态结构,它是从客观世界实体的对象关系角度来描述,表现了对象的相互关系。该模型主要关心系统中对象的结构、属性和操作,它是分析阶段三个模型的核心,是其他两个模型的框架。
1.对象和类
(1) 对象。
对象建模的目的就是描述对象。
(2) 类。
通过将对象抽象成类,我们可以使问题抽象化,抽象增强了模型的归纳能力。
(3) 属性。
属性指的是类中对象所具有的性质(数据值)。
(4) 操作和方法。
操作是类中对象所使用的一种功能或变换。类中的各对象可以共享操作,每个操作都有一个目标对象作为其隐含参数。
方法是类的操作的实现步骤。
2.关联和链
关联是建立类之间关系的一种手段,而链则是建立对象之间关系的一种手段。
(1) 关联和链的含义。
链表示对象间的物理与概念联结,关联表示类之间的一种关系,链是关联的实例,关联是链的抽象。
(2) 角色。
角色说明类在关联中的作用,它位于关联的端点。
(3) 受限关联。
受限关联由两个类及一个限定词组成,限定词是一种特定的属性,用来有效的减少关联的重数,限定词在关联的终端对象集中说明。
限定提高了语义的精确性,增强了查询能力,在现实世界中,常常出现限定词。
(4) 关联的多重性。
关联的多重性是指类中有多少个对象与关联的类的一个对象相关。重数常描述为“一”或“多”。
3.类的层次结构
(1) 聚集关系。
聚集是一种“整体-部分”关系。在这种关系中,有整体类和部分类之分。聚集最重要的性质是传递性,也具有逆对称性。
聚集可以有不同层次,可以把不同分类聚集起来得到一颗简单的聚集树,聚集树是一种简单表示,比画很多线来将部分类联系起来简单得多,对象模型应该容易地反映各级层次,图10-10表示一个关于微机的多极聚集。
(2)一般化关系。
一般化关系是在保留对象差异的同时共享对象相似性的一种高度抽象方式。它是“一般---具体”的关系。一般化类称为你类,具体类又能称为子类,各子类继承了交类的性质,而各子类的一些共同性质和操作又归纳到你类中。因此,一般化关系和继承是同时存在的。一般化关系的符号表示是在类关联的连线上加一个小三角形,如图10-11
4.对象模型
(1)模板。模板是类、关联、一般化结构的逻辑组成。
(2)对象模型。
对象模型是由一个或若干个模板组成。模板将模型分为若干个便于管理的子块,在整个对象模型和类及关联的构造块之间,模板提供了一种集成的中间单元,模板中的类名及关联名是唯一的。
动态模型
动态模型是与时间和变化有关的系统性质。该模型描述了系统的控制结构,它表示了瞬间的、行为化的系统控制
性质,它关心的是系统的控制,操作的执行顺序,它表示从对象的事件和状态的角度出发,表现了对象的相互行为。
该模型描述的系统属性是触发事件、事件序列、状态、事件与状态的组织。使用状态图作为描述工具。它涉及到事件、状态、操作等重要概念。
1.事件
事件是指定时刻发生的某件事。
2.状态
状态是对象属性值的抽象。对象的属性值按照影响对象显著行为的性质将其归并到一个状态中去。状态指明了对象
对输入事件的响应。
3.状态图
状态图是一个标准的计算机概念,他是有限自动机的图形表示,这里把状态图作为建立动态模型的图形工具。
状态图反映了状态与事件的关系。当接收一事件时,下一状态就取决于当前状态和所接收的该事件,由该事件引起的状态变化称为转换。
状态图是一种图,用结点表示状态,结点用圆圈表示;圆圈内有状态名,用箭头连线表示状态的转换,上面标记事件名,箭头方向表示转换的方向。
功能模型
功能模型描述了系统的所有计算。功能模型指出发生了什么,动态模型确定什么时候发生,而对象模型确定发生的客体。功能模型表明一个计算如何从输入值得到输出值,它不考虑计算的次序。功能模型由多张数据流图组成。数据流图用来表示从源对象到目标对象的数据值的流向,它不包含控制信息,控制信息在动态模型中表示,同时数据流图也不表示对象中值的组织,值的组织在对象模型中表示。
数据流图中包含有处理、数据流、动作对象和数据存储对象。
1.处理
数据流图中的处理用来改变数据值。最低层处理是纯粹的函数,一张完整的数据流图是一个高层处理。
2.数据流
数据流图中的数据流将对象的输出与处理、处理与对象的输入、处理与处理联系起来。在一个计算机中,用数据流来表示一中间数据值,数据流不能改变数据值。
3.动作对象
动作对象是一种主动对象,它通过生成或者使用数据值来驱动数据流图。
4.数据存储对象
数据流图中的数据存储是被动对象,它用来存储数据。它与动作对象不一样,数据存储本身不产生任何操作,它只响应存储和访问的要求。
面向对象的分析
面向对象分析的目的是对客观世界的系统进行建模。本节以上面介绍的模型概念为基础,结合“银行网络系统”的具体实例来构造客观世界问题的准确、严密的分析模型。
分析模型有三种用途:用来明确问题需求;为用户和开发人员提供明确需求;为用户和开发人员提供一个协商的基础,作为后继的设计和实现的框架。
(一)面向对象的分析
系统分析的第一步是:陈述需求。分析者必须同用户一块工作来提炼需求,因为这样才表示了用户的真实意图,其中涉及对需求的分析及查找丢失的信息。下面以“银行网络系统”为例,用面向对象方法进行开发。
(二)建立对象模型
首先标识和关联,因为它们影响了整体结构和解决问题的方法,其次是增加属性,进一步描述类和关联的基本网络,使用继承合并和组织类,最后操作增加到类中去作为构造动态模型和功能模型的副产品。
1.确定类
构造对象模型的第一步是标出来自问题域的相关的对象类,对象包括物理实体和概念。所有类在应用中都必须有意义,在问题陈述中,并非所有类都是明显给出的。有些是隐含在问题域或一般知识中的。
(1)冗余类:若两个类表述了同一个信息,保留最富有描述能力的类。如"用户"和"顾客"
就是重复的描述,因为"顾客"最富有描述性,因此保留它。
(2)不相干的类:除掉与问题没有关系或根本无关的类。例如,摊派费用超出了银行网络的范围。
(3)模糊类:类必须是确定的,有些暂定类边界定义模糊或范围太广,如"记录保管"就模糊类,它是"事务"中的一部分。
(4)属性:某些名词描述的是其他对象的属性,则从暂定类中删除。如果某一性质的独立性很重要,就应该把他归属到类,而不把它作为属性。
(5)操作:如果问题陈述中的名词有动作含义,则描述的操作就不是类。但是具有自身性质而且需要独立存在的操作应该描述成类。如我们只构造电话模型,"拨号"就是动态模型的一部分而不是类,但在电话拨号系统中,"拨号"是一个重要的类,它日期、时间、受话地点等属性。
2.准备数据字典
为所有建模实体准备一个数据字典。准确描述各个类的精确含义,描述当前问题中的类的范围,包括对类的成员、用法方面的假设或限制。
3.确定关联
两个或多个类之间的相互依赖就是关联。一种依赖表示一种关联,可用各种方式来实现关联,但在分析模型中应删除实现的考虑,以便设计时更为灵活。关联常用描述性动词或动词词组来表示,其中有物理位置的表示、传导的动作、通信、所有者关系、条件的满足等。从问题陈述中抽取所有可能的关联表述,把它们记下来,但不要过早去细化这些表述。
4.确定属性
属性是个体对象的性质,属性通常用修饰性的名词词组来表示.形容词常常表示具体的可枚举的属性值,属性不可能在问题陈述中完全表述出来,必须借助于应用域的知识及对客观世界的知识才可以找到它们。只考虑与具体应用直接相关的属性,不要考虑那些超出问题范围的属性。首先找出重要属性,避免那些只用于实现的属性,要为各个属性取有意义的名字。按下列标准删除不必要的和不正确的属性:
(1)对象:若实体的独立存在比它的值重要,那么这个实体不是属性而是对象。如在邮政目录中,"城市"是一个属性,然而在人口普查中,"城市"则被看作是对象。在具体应用中,具有自身性质的实体一定是对象。
(2)定词:若属性值取决于某种具体上下文,则可考虑把该属性重新表述为一个限定词。
(3)名称:名称常常作为限定词而不是对象的属性,当名称不依赖于上下文关系时,名称即为一个对象属性,尤其是它不惟一时。
(4)标识符:在考虑对象模糊性时,引入对象标识符表示,在对象模型中不列出这些对象标识符,它是隐含在对象模型中,只列出存在于应用域的属性。
(5)内部值:若属性描述了对外不透明的对象的内部状态,则应从对象模型中删除该属性。
(6)细化:忽略那些不可能对大多数操作有影响的属性。
5.使用继承来细化类
使用继承来共享公共机构,以次来组织类,可以用两种方式来进行。
(1)自底向上通过把现有类的共同性质一般化为父类,寻找具有相似的属性,关系或操作的类来发现继承。例如"远程事务"和"出纳事务"是类似的,可以一般化为" 事务"。有些一般化结构常常是基于客观世界边界的现有分类,只要可能,尽量使用现有概念。对称性常有助于发现某些丢失的类。
(2)自顶向下将现有的类细化为更具体的子类。具体化常常可以从应用域中明显看出来。应用域中各枚举字情况是最常见的具体化的来源。例如:菜单,可以有固定菜单,顶部菜单,弹出菜单,下拉菜单等,这就可以把菜单类具体细化为各种具体菜单的子类。当同一关联名出现多次且意义也相同时,应尽量具体化为相关联的类,例如"事务"从"出纳站"和"自动出纳机"进入,则"录入站"就是"出纳站"和"自动出纳站"的一般化。在类层次中,可以为具体的类分配属性和关联。各属性和都应分配给最一般的适合的类,有时也加上一些修正。
应用域中各枚举情况是最常见的具体化的来源。
6.完善对象模型
对象建模不可能一次就能保证模型是完全正确的,软件开发的整个过程就是一个不断完善的过程。模型的不同组成部分多半是在不同的阶段完成的,如果发现模型的缺陷,就必须返回到前期阶段去修改,有些细化工作是在动态模型和功能模型完成之后才开始进行的。
(1)几种可能丢失对象的情况及解决办法:
·同一类中存在毫无关系的属性和操作,则分解这个类,使各部分相互关联;
·一般化体系不清楚,则可能分离扮演两种角色的类
·存在无目标类的操作,则找出并加上失去目标的类;
·存在名称及目的相同的冗余关联,则通过一般化创建丢失的父类,把关联组织在一起。
(2)查找多余的类。
类中缺少属性,操作和关联,则可删除这个类。
(3)查找丢失的关联。
丢失了操作的访问路径,则加入新的关联以回答查询。
(三)建立动态模型
1.准备脚本
动态分析从寻找事件开始,然后确定各对象的可能事件顺序。在分析阶段不考虑算法的执行,算法是实现模型的一部分。
2.确定事件
确定所有外部事件。事件包括所有来自或发往用户的信息、外部设备的信号、输入、转换和动作,可以发现正常事件,但不能遗漏条件和异常事件。
3.准备事件跟踪表
把脚本表示成一个事件跟踪表,即不同对象之间的事件排序表,对象为表中的列,给每个对象分配一个独立的列。
4.构造状态图
对各对象类建立状态图,反映对象接收和发送的事件,每个事件跟踪都对应于状态图中一条路径。
(四)建立功能建模
功能模型用来说明值是如何计算的,表明值之间的依赖关系及相关的功能,数据流图有助于表示功能依赖关系,其中的处理应于状态图的活动和动作,其中的数据流对应于对象图中的对象或属性。
1.确定输入值、输出值
先列出输入、输出值,输入、输出值是系统与外界之间的事件的参数。
2.建立数据流图
数据流图说明输出值是怎样从输入值得来的,数据流图通常按层次组织。
(五)确定操作
在建立对象模型时,确定了类、关联、结构和属性,还没有确定操作。只有建立了动态模型和功能模型之后,才可能最后确定类的操作。
面向对象的设计
面向对象设计是把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。从面向对象分析到面向对象设计,是一个逐渐扩充模型的过程。
瀑布模型把设计进一步划分成概要设计和详细设计两个阶段,类似地,也可以把面向对象设计再细分为系统设计和对象设计。系统设计确定实现系统的策略和目标系统的高层结构。对象设计确定解空间中的类、关联、接口形式及实现操作的算法。
(一)面向对象设计的准则
1.模块化
面向对象开发方法很自然地支持了把系统分解成模块的设计原则:对象就是模块。它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。
2.抽象
面向对象方法不仅支持过程抽象,而且支持数据抽象。
3.信息隐藏
在面向对象方法中,信息隐藏通过对象的封装性来实现。
4.低耦合
在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。低耦合是设计的一个重要标准,因为这有助于使得系统中某一部分的变化对其它部分的影响降到最低程度。
5.高内聚
(1)操作内聚。
(2)类内聚。
(3)一般——具体内聚。
(二)面向对象设计的启发规则
1.设计结果应该清晰易懂
使设计结果清晰、易懂、易读是提高软件可维护性和可重用性的重要措施。显然,人们不会重用那些他们不理解的设计。
要做到:
(1)用词一致。
(2)使用已有的协议。
(3)减少消息模式的数量。
(4)避免模糊的定义。
2.一般——具体结构的深度应适当
3.设计简单类
应该尽量设计小而简单的类,这样便以开发和管理。为了保持简单,应注意以下几点:
(1)避免包含过多的属性。
(2)有明确的定义。
(3)尽量简化对象之间的合作关系。
(4)不要提供太多的操作。
4.使用简单的协议
一般来说,消息中参数不要超过3个。
5.使用简单的操作
面向对象设计出来的类中的操作通常都很小,一般只有3至5行源程序语句,可以用仅含一个动词和一个宾语的简单句子描述它的功能
6.把设计变动减至最小
通常,设计的质量越高,设计结果保持不变的时间也越长。即使出现必须修改设计的情况,也应该使修改的范围尽可能小。
(三)系统设计
系统设计是问题求解及建立解答的高级策略。必须制定解决问题的基本方法,系统的高层结构形式包括子系统的分解、它的固有并发性、子系统分配给硬软件、数据存储管理、资源协调、软件控制实现、人机交互接口。
1.系统设计概述
设计阶段先从高层入手,然后细化。系统设计要决定整个结构及风格,这种结构为后面设计阶段的更详细策略的设计提供了基础。
(1)系统分解。
系统中主要的组成部分称为子系统,子系统既不是一个对象也不是一个功能,而是类、关联、操作、事件和约束的集合。
(2)确定并发性。
分析模型、现实世界及硬件中不少对象均是并发的。
(3)处理器及任务分配。
各并发子系统必须分配给单个硬件单元,要么是一个一般的处理器,要么是一个具体的功能单元。
(4)数据存储管理。
系统中的内部数据和外部数据的存储管理是一项重要的任务。通常各数据存储可以将数据结构、文件、数据库组合在一起,不同数据存储要在费用、访问时间、容量及可靠性之间做出折衷考虑。
(5)全局资源的处理。
必须确定全局资源,并且制定访问全局资源的策略。
(6)选择软件控制机制。
分析模型中所有交互行为都表示为对象之间的事件。系统设计必须从多种方法中选择某种方法来实现软件的控制。
(7)人机交互接口设计。
设计中的大部分工作都与稳定的状态行为有关,但必须考虑用户使用系统的交互接口。
2.系统结构的一般框架
3.系统分解——建立系统的体系结构
可用的软件库以及程序员的编程经验。
通过面向对象分析得到的问题域精确模型,为设计体系结构奠定了良好的基础,建立了完整的框架。
4.选择软件控制机制
软件系统中存在两种控制流,外部控制流和内部控制流。
5.数据存储管理
数据存储管理是系统存储或检索对象的基本设施,它建立在某种数据存储管理系统之上,并且隔离了数据存储管理模式的影响。
6.设计人机交互接口
在面向对象分析过程中,已经对用户界面需求作了初步分析,在面向对象设计过程中,则应该对系统的人机交互接口进行详细设计,以确定人机交互的细节,其中包括指定窗口和报表的形式、设计命令层次等项内容。
(四)对象设计
1.对象设计概述
2.三种模型的结合
(1)获得操作。
(2)确定操作的目标对象。
3.算法设计
4.优化设计
5.控制的实现
6.调整继承
7.关联的设计
面向对象的实现
(一)程序设计语言
1.选择面向对象语言
采用面向对象方法开发软件的基本目的和主要优点是通过重用提高软件的生产率。因此,应该优先选用能够最完善、最准确地表达问题域语义的面向对象语言。
在选择编程语言时,应该考虑的其他因素还有:对用户学习面向对象分析、设计和编码技术所能提供的培训操作;在使用这个面向对象语言期间能提供的技术支持;能提供给开发人员使用的开发工具、开发平台,对机器性能和内存的需求,集成已有软件的容易程度。
2.程序设计风格
(1)提高重用性。
(2)提高可扩充性。
(3)提高健壮性。
(二)类的实现
在开发过程中,类的实现是核心问题。在用面向对象风格所写的系统中,所有的数据都被封装在类的实例中。而整个程序则被封装在一个更高级的类中。在使用既存部件的面向对象系统中,可以只花费少量时间和工作量来实现软件。只要增加类的实例,开发少量的新类和实现各个对象之间互相通信的操作,就能建立需要的软件。
一种方案是先开发一个比较小、比较简单的来,作为开发比较大、比较复杂的类的基础。
(1)“原封不动”重用。
(2)进化性重用。
一个能够完全符合要求特性的类可能并不存在。
(3)“废弃性”开发。
不用任何重用来开发一个新类。
(4)错误处理。
一个类应是自主的,有责任定位和报告错误。
(三)应用系统的实现
应用系统的实现是在所有的类都被实现之后的事。实现一个系统是一个比用过程性方法更简单、更简短的过程。有些实例将在其他类的初始化过程中使用。而其余的则必须用某种主过程显式地加以说明,或者当作系统最高层的类的表示的一部分。
在C++和C中有一个main( )函数,可以使用这个过程来说明构成系统主要对象的那些类的实例。
(四)面向对象测试
(1)算法层。
(2)类层。
测试封装在同一个类中的所有方法和属性之间的相互作用。
(3)模板层。
测试一组协同工作的类之间的相互作用。
(4)系统层。
把各个子系统组装成完整的面向对象软件系统,在组装过程中同时进行测试。
课题:面向对象程序设计的基本思想 (一)教学设计思想与理论依据: 《算法与程序设计》模块的教学强调通过该模块的学习,学生应该体验客 观世界的计算机对象化表征和算法思维,掌握几种基本算法;能运用面向对 象的方法,设计解决简单问题的算法,并能初步使用一种面向对象的程序设 计语言,编制程序实现算法解决该问题。 (二)教学内容分析 教材以广东教育出版社出版的信息技术(选修一)《算法与程序设计》第五章第一节内容为结构框架,本节主要介绍面向对象思想产生的必然性和面向对象思想的机制,以及通过对同一个问题采取面向过程和面向对象两种不同思想解决的区别,让学生感受到面向对象程序设计的优越性。 (三)学生情况分析: 学生已学完教材前四章内容,基本掌握了传统的面向过程结构化程序设计方法,有一定的程序设计基础。 (四)教学策略与模式: 采用讲解、任务驱动、实践和学生自主学习相结合的教学方式 (五)教学资源: 硬件:多媒体电脑教室,投影仪,广播系统 软件:学生机安装vb6.0 (六)教学目标: 知识与技能 1.了解面向对象程序设计的基本思想和面向对象思想的由来,并能够举例说 明现实世界与面向对象系统之间的对应关系。 2.了解面向对象程序设计的优越性并初步理解其实现的机制。 过程与方法 经历分析、调试解决同一问题的两种不同实现思想的程序,初步理解面向对象程序设计的优势及面向过程程序设计的缺陷。 情感态度和价值观 (1)关注传统结构化程序设计存在的问题。 (2)产生学习面向对象程序设计技术的愿望。 (3)关注面向对象技术是当前程序设计的重要发展方向。 (七)重点难点 教学重点 (1)传统结构化程序设计存在的问题 (2)面向对象程序设计所具有的优点。 教学难点 (1)面向对象思想的产生。 (2)传统结构化程序设计与面向对象程序设计的基本点比较。 (3)实现面向对象程序设计的基本机制。 教学过程:
面向对象思想----不看后悔! 前言: 整理这份资料的目的是为了帮助朋友们能够更直观的理解面向对象的编程。让后来者能够少走一些弯路。但其中不免有许多漏洞及错误,也还请前辈提出宝贵的更改意见,毕竟交流会让我们不断的进步。 技术是日新月异的,他不会等待你的成长。技术要拿出来于别人交流,自己学是自己主观意识上的理解,有对有错!交流会让进步变得更快。我认为如果计算机的体系结构不发生革命性的变化,我们现在所应用的程序语言也就百变不离奇踪了!学编程学的是什么?思想!精通一门编程语言(最好是面向对象的语言)后再去搞其他的编程语言,你会发现过程是如此的行云流水!为什么?你已经把编程的思想掌握了,再去学其他的,无非是学习一种新的语法格式了。 我在这里并不是和你讨论怎么去用C++或JAVA,也不是和你讨论怎么去学他们,我要和你讨论的是怎么去理解面向对象。其中主要会涉及到“类、对象、继承、属性、方法、静态、重载、隐藏、重构、声明、定义、初始化、赋值等”其中有许多相关技术我只会一代而过,让你有一种到此一游的意味我就达到目的了,而更详细的技术内幕,就请参考其他相关书籍而深入研究吧!因为我只是在和你探讨如何去更好的理解面向对象! 如何去提高效率?重复使用资源,把别人的东西拿来就用。这是很不错的主意!而对于你来说,最大的资源就是信心以及积极性!好,打起精神来,让我们一同到面向对象的编程中去寻幽访胜吧! 注:文章中所有程序实例我都使用JAVA写的,当然在C++中也就大同小异了了,不同的地方我会指出! 注:文章中的正文文字用黑色,说明文字用蓝色,强调文字用橙色,批改文字用红色! 正文: 1.基本概念: 1.1 类与对象的初探 要我说,无论是面向过程的语言也好,面向对象的语言也罢,我首先要给他讲的都是类和对象!--------“这个世界是由什么组成的?”这个问题如果让不同的人来回答会得到不同的答案。如果是一个化学家,他也许会告诉你“还用问嘛?这个世界是由分子、原子、离子等等的化学物质组成的”。如果是一个画家呢?他也许会告诉你,“这个世界是由不同的颜色所组成的”。……呵呵,众说纷纭吧!但如果让一个分类学家来考虑问题就有趣的多了,他会告诉你“这个世界是由不同类型的物与事所构成的”好!作为面向对象的程序员来说,我们要站在分类学家的角度去考虑问题!是的,这个世界是由动物、植物等组成的。动物又分为单细胞动物、多细胞动物、哺乳动物等等,哺乳动物又分为人、大象、老虎……就这样的分下去了! 现在,站在抽象的角度,我们给“类”下个定义吧!我的意思是,站在抽象的角度,你回答我“什么是人类?”首先让我们来看看人类所具有的一些特征,这个特征包括属性(一些参数,数值)以及方法(一些行为,他能干什么!)。每个人都有身高、体重、年龄、血型等等一些属性。人会劳动、人都会直立行走、人都会用自己的头脑去创造工具等等这些方法!人之所以能区别于其它类型的动物,是因为每个人都具有人这个群体的属性与方法。“人类”只是一个抽象的概念,它仅仅是一个概念,它是不存在的实体!但是所有具备“人类”这个群体的属性与方法的对象都叫人!这个对象“人”是实际存在的实体!每个人都是人这个群
面向对象的基础思想 1 类与对象(重点) 1.1类与对象的基本关系 类与对象是整个面向对象概念之中的最为重要的组成部分。 类:类是对整个现实世界的一种合理的抽象,是一种共性的产物,在类之中主要有两个组成部分:属性(变量)、行为(方法); 对象:是一个具体的,可以使用的产物,是一种个性的表示。 实际上类中规定了一个对象的具体行为,而对象是一个类的具体表现。类只有通过对象才可以使用,所以在开发之中一定要先有类之后再定义对象。 但是一个类产生之后就好比汽车的设计图纸那样,本身并不能直接使用,必须按照图纸生产出具体的汽车之后才可以开,所以需要对象,而对象定义格式如下: 格式一:声明并实例化对象 格式二:分步完成 通过以上的格式可以发现,依然存在了关键字new,所以这一操作也一定表示要开辟堆内存空间,同时需要注意的是,当一个对象开辟空间之后可以按照如下的两个方式来操作类中的内容: ·操作类中的属性:对象.属性; ·操作类中的方法:对象.方法(); 范例:声明并实例化对象
但是类本身属于引用数据类型,所以以上的程序依然要牵扯到内存的划分,同样使用两块内存:·堆内存:保存的是每一个对象所具备的属性; ·栈内存:保存的是一块堆内存的使用地址,可以简单理解为对象名称。 1.2浅深入引用传递 清楚了以上的内存关系之后,下面再来对另外一个类似的程序进行观察。如果说现在同时产生了两个
只要发现了关键字new,那么一定表示要开辟的是一块新的内存空间,每一块堆内存空间都有一个栈内存指向它。 范例:观察如下程序
发现现在一个per对象没有进行实例化的操作,这个时候程序编译没有任何的语法错误,但是程序执行的时候出现了以下的错误提示: 现在给出的是“NullPointerException”,表示空指向异常。此异常肯定会伴随你的开发人生走完的那一刻,此异常只有在引用数据类型操作的时候才会出现。NullPointerException更准确的讲法是指使用只声明而未开辟空间的引用类型所造成的问题,所以为了区分此概念,以后对于对象而言,在操作上就会给出两个不同的名词: ·声明对象:只开辟了栈内存空间的对象,无法直接使用; ·实例化对象:有了对应的堆内存空间指向,可以使用; 以上的分析流程和数组是完全一样的,因为数组也属于引用数据类型,在数组学习的时候强调过,所谓的引用传递实际上指的就是一块堆内存空间可以同时被多个栈内存所指向的操作,那么对于类也是一样的,引用传递指的是一块堆内存同时被不同的对象(不同的栈)所指向。 范例:观察引用传递
面向对象程序设计 ?结构化程序设计的基本内容: 1.结构的类型:顺序、分支、循环 2.结构化程序设计思想:利用过程或函数来抽象和模拟客观现实。 3.结构化程序设计方法: 1)重点放在如何实现细节过程方面,将数据与函数分开。 2)形式:主模块+若干个子模块(如C:main()+子函数)。 4.特点:自顶向下,逐步求精——功能分解。 5.缺点:效率低,是手工作坊式的编程。 6.结构化程序的问题——数据与算法分离,程序数据和操作数据的函数 是分离的。 ?面向对象程序设计观点: 1.自然界是由各种各样的实体(对象)所组成,每种对象都有自己的内 部状态和运动规律,不同对象之间的相互联系和相互作用就构成了各种 不同的系统,进而构成整个客观世界。 2.程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。 3.要求:高度概括、分类和抽象。 4.目的:实现软件设计的产业化。 5.基本概念: 1)对象:用来描述客观事物的一个实体,它是构成系统的一个基本单 元。一个对象具有一组属性和行为。 实体对象*一台计算机 抽象对象*一项计划 2)对象构成要素: 对象标识符:是对象的名称,用来区别于其他对象。 属性:是用来描述对象静态特征的一个数据项。 行为:是用来描述对象动态特征和行为的操作。 3)消息(Message)用于描述事件发生的信息。消息是对象之间发出 的行为请求。多个消息构成一个事件(Event)。对象之间通过传递消 息相互影响。 对象示例:一个“学生”对象的例子 对象名: 学生 属性: 学号:123456 :令狐冲 年龄:18 专业:信管 行为: 修改学号、、专业、年龄等等 对象示例:一个“课程”对象的例子: 对象名: 课程 属性:
1.面向对象的理解并举例? 2.类与对象之间的关系? 3.如何对类进行分析,如果创建自定义类对象,并如何指挥对象做事情? 4.对象的内存分布图? 5.成员变量和局部变量的区别? 6.私有的使用。 7.构造函数和一般函数的区别? 8.构造函数什么时候用? 9.构造代码块的作用? 10.this关键字的特点和使用以及应用场景? 1.静态和非静态的区别。说一下内存。 2.成员变量和静态变量的区别? 3.静态的特点以及注意事项? 4.什么时候使用静态? 5.继承的好处? 6.java改良多继承的原因? 7.当使用一个已存在的继承体系时,该如何更快应用 8.什么时候用继承? 9.super和this的特点? 10.覆盖的特点,何时应用,注意事项? 11.子类的实例化过程?为什么是这样的实例化过程? 12.super语句,和this语句为什么不能同时存在,super为什么要定义在第一行? 13.抽象类的特点,以及细节? 14.接口的表现形式的特点。 15.接口的思想特点,要举例。 16.多实现和多继承的区别? 17.抽象类和接口的区别? 18.多态的体现,前提,好处,弊端。 19.为什么要将一个类定义成内部类? 20.匿名内部类的使用和细节(面试题) 21.异常的思想和体系特点? 22.throws和throw的如何使用? 23.什么时候try 什么时候throws? 24.编译时被检测异常和运行时异常的区别? 25.异常的所有细节? 26.finally的应用? 27.包的作用,名称空间的定义和理解? 28.jar包的基本使用。只要将类和包都存储到jar中,方便于使用。只要将jar配置到classpath 路径下。 29. 1
Java面向对象程序设计实验课的心得体会经过这几周对Java面向对象程序设计的学习,让我更加了解到Java 学习的重要性。 在实验课上,我们完成多个实验,在这个阶段的学习中,我从认识到熟悉,而后到能够自主运用。通过对Java的了解,我发现它确实有很多方便之处,它集抽象性、封装性、继承性和多态性于一体,实现了代码重用和代码扩充,提高了软件开发的效率。对于我们这个专业来说学好Java语言是很重要的,所以在实验的过程中我都尽力理解java编程思想、掌握基本技巧,尽量学到最多的知识。 学习程序设计的基本目的就是培养描述实际问题的程序化解决方案的关键技能,Java面向对象程序设计是一门实践性比较强的课程,在实际中,我们必须把理论和实践结合起来。在实验中,我们理解理论课上的知识,然后运用到实际的操作中,我们必须在现有的理论的基础上,进行实践。多次实验后,也让我看到了现在学习的一个很大弱点:只听不练,永远不会熟练运用;空记技巧,忽略思想,会在多变的习题中十分无奈。 Java思想:Java是一门面向对向语言,他定义一切都是对象 面向对象,就是面对现实; 现实中的一切都是对象,他们有分类,就产生了类” 他们有不同,类和类之间的不同,使用类来区分;同一个类中不同的对象 的区别,使用成员区分。 所以,面向对象的内部逻辑是分类
面向对象编程思想就象数学上的一些概念,如:空间、群、环、 域等 原始的编程思想就象古典数学,人们只在一个集合上探讨问题,没有系统的方法(即运算)定义,于是仁者见仁、智者见智,这样在一定程度上造成了理论的一种混乱局面,不利于科学的发展。于是近代数学向公理化发展,这是什么意思呢?就是说,人们除了在限定论域(即上面的集合,面向对象也有此概念)夕卜,还在此论域上加进了一套通用的、公认的运算(方法);集合加上集合上定义的运算就构成了数学上的空间、群等,在计算机领域里,就变成为类”这种集合上定义了操作的东西利用起来就方便多了,这使得人们讨论问题时都在给定集合的运算能力上下工夫,即有通用性可事半功倍。 面向对象的编程思想就要想近世代数的分析思想,首先要确定论域”即工程所涉及到的所有的对象”然后要分类处理,把隶属同一类别的对象集合在一起(做成一个集合),定义他们之间的运算性质及可以进行的操作,这样就构建了一个类,当然以后用到这个类的对象时都要通过已经定义了的操作来完成各项功能,这就是常要求的类的类的成员变量要通过共有函数来操作” 我想真正的面向对象编程思想不应该是编程思想,应该是面向对象的分析方法才对! 我的理解:1、将分析过程为抽象的过程:简言之:分成多个小问题(组成部分),直到无法再细; 2、对每个对象(小问题)进行分析,抽象,提取处共同的内容(数据成员
Java面向对象编程思想 Java面向对象编程思想 (1) 1 版权声明 (2) 2 第一章.浅议 (2) 2.1 什么是类,什么是对象 (2) 2.2 类实例化的几个过程详解 (3) 2.3 什么是继承 (4) 2.4 什么是重载 (5) 2.5 什么是重写 (5) 2.6 多态的三种表现形式 (6) 3 第二章构造方法 (6) 4 第三章.抽象类和方法 (7) 5 第四章.接口 (7) 6 第五章.接口和抽象类的区别 (8) 7 第六章.Java中的异常 (13) 7.1 异常和异常处理的初步认识 (13) 7.2 Java中异常的封装 (15) 7.3 异常处理try/catch/finally (16) 7.4 异常的生成再认识 (22) 7.5 Log4e插件使用 (25) 8 第七章.Java中的修饰符 (26)
1版权声明 此文档只能用于学习以及教学,请勿用作商业用途,因此而产生的法律问题,本人一概不负责。 本人声明,此文档资料为本人教学经验和网络资料收集合并之成果,如果在文档中引用了您的资料,而引起了侵犯您的权益的话,可以发送邮件知会,本人必定删除为是。 2第一章.浅议 总所周知,Java是一种面向对象的语言(所谓OOP-Object Oriented Programming),但是很多人在学习Java的过程中对什么是类,什么是对象,什么是面向对象,为什么要有继承,为什么要有实现,为什么要继承和实现,为什么要有抽象类和接口都不是十分的清楚,今天在这里,就让不才浅议,未免贻笑大方,还望各位大大不吝赐教。 注:阅读此文档,不需要你是使用Java的高手,但是已经假设你有了一定的Java技术的基础。 理解面向对象,理解抽象,我想就应该是真正开始用面向对象的思想去分析问题,解决问题了吧。 2.1 什么是类,什么是对象 首先讲清楚类和对象的区别。 类是广泛的概念,表示一个具有相同属性和方法的多个对象的集合,是一个有共同性质的群体,而对象,所谓“万物皆对象”,指的是具体的一个实实在在的东西。 例如,“人”是一个类,它可以表示地球上所有的人;而“张三”、“李四”、“爱因斯坦”等则是
面向对象程序设计基本概念 面向对象设计是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。 对象:对象是要研究的任何事物。从一本书到一家图书馆,单的整数到整数列庞大的数据库、极其复杂的自动化工厂、航天飞机都可看作对象,它不仅能表示有形的实体,也能表示无形的(抽象的)规则、计划或事件。对象由数据(描述事物的属性)和作用于数据的操作(体现事物的行为)构成一独立整体。从程序设计者来看,对象是一个程序模块,从用户来看,对象为他们提供所希望的行为。 类:类是对象的模板。即类是对一组有相同数据和相同操作的对象的定义,一个类所包含的方法和数据描述一组对象的共同属性和行为。类是在对象之上的抽象,对象则是类的具体化,是类的实例。类可有其子类,也可有其它类,形成类层次结构。 消息:消息是对象之间进行通信的一种规格说明。一般它由三部分组成:接收消息的对象、消息名及实际变元。 面向对象主要特征: 封装性:封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象。 继承性:继承性是子类自动共享父类之间数据和方法的机制。它由类的派生功能体现。一个类直接继承其它类的全部描述,同时可修改和扩充。继承具有传递性。继承分为单继承(一个子类只有一父类)和多重继承(一个类有多个父类)。类的对象是各自封闭的,如果没继承性机制,则类对象中数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。 多态性:对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定,如是,同一消息即可调用不同的方法。例如:Print消息被发送给一图或表时调用的打印方法与将同样的Print消息发送给一正文文件而调用的打印方法会完全不同。多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。在OOPL中可通过在派生类中重定义基类函数(定义为重载函数或虚函数)来实现多态性。
面向对象的逻辑思维方法 什么是面向对象的设计思想?也许有不少初学者对这个概念还有许多不明白的地方,特别是这个处于新旧思想交替的时代,许多人刚刚学完现在看来是快要淘汰的只是面向过程的语言。他们的脑子还没有脱离面向过程思想的束缚,抬头却发现,“面向对象”早已经流行开来,这个陌生的词漫天飞舞。随便拿起一本流行计算机技术书籍,那里会没有“面向对象”的字眼!于是心中便惶惑了:什么叫“面向对象”?不感兴趣者,一带而过;有志于在这方面发展的,匆忙找到一本有关书籍来啃究竟什么是“面向对象”。然而,要突破思想的束缚,说难也不难,说到要深刻认识却也不容易。笔者在做了一些轻量级的工作后,颇以为有点心得,不怕贻笑大方,写出已供广大同行批评指正。 “对象(Object)”一词,早在十九世纪就有现象学大师胡塞尔提出并定义。对象是世界中的物体在人脑中的映象,是人的意识之所以为意识的反映,是做为一种概念而存在的先念的东西,它还包括了人的意愿。举例说明吧。当我们认识到一种新的物体,它叫树,于是在我们的意识当中就形成了树的概念。这个概念会一直存在于我们的思维当中,并不会因为这棵树被砍掉而消失。这个概念就是现实世界当中的物体在我们意识当中的映象。我们对它还可以有我们自己的意愿,虽然我们并不需要付诸实现——只要在你的脑中想着把这棵树砍掉做成桌子、凳子等——我们就把它叫做意向。于是,对象就是客观世界中物体在人脑中的映象及人的意向。只要这个对象存在我们的思维意识当中,我们就可以籍此判断同类的东西。譬如,当我们看到另外一棵树是,并不会因为所见的第一棵树不在了失去了供参照的模板而不认识这棵树了。当我们接触某些新事物时,我们的意识就会为这些事物确立一个对象。当然这个过程是怎么形成的,那就不是我们所能讨论的问题了。上面所说的对象研究的是一般意义上的问题,因而它可以外推到一切事物。我们经常所说的“对象”,一班指的是解决信息领域内所遇到问题的方法。特别是应用软件技术来决问题的方法。如我们经常碰到的面向对象的编程(Object-Oriented Programming)、面向对象的分析(Object-Oriented Analysis)、面向对象的设计 (Object-Oriented Design)等。应用前面所介绍的关于对象的概念,可以对这些问题做进一步的分析。在面对较复杂的系统,我们可以将它作为一个对象来进行分析。一个系统(解决某个问题的全套解决方案)作为一个对象,可以由多个部分组成。同样,这个对象也可以由多个对象组成。对于同类的事物,可以由一个对象来表示。这样做的益处是显而易见的,它灵活而高效,可以大大减轻设计人员的工作量,简化实际的模型。举一个例子。在关系型数据库的设计当中,我们可以把一个元组当作对象,给它定义一组操作方法。这些方法将适用于所有元组,从而我们不必在更大的范围内去细致的考虑不同的元组(如判断一个元素是否合法):因为它们有一组公共的面向本身的方法,它们“自己”可以“解决”自己的问题。更上一层的对象可以是一个表、视图等。表对象在元组对象的基础上又有它们自己的方法,如增加、删除等。从这个层面上讲,它也只需要做“自己”的事情,
一:Java面向对象的编程思想: 1.Java具有面向对象的三大特征: 封装:通过java的类来实现数据和操作方法的封装,对外界可以将每一个Java类都视为一个黑箱,只需要调用该黑箱提供的方法即可完成你想要的操作。 继承:通过类的继承,便于将统一的功能集中在父类中,实现代码的重用和可维护性多态:通过重载、重写与覆盖,实现不同类的不同形态特征。 以上这三大特征是通过具体的类、抽象类与接口技术来体现的。 2.把封装的类进行实例化,可以生成多个对象,这些对象通过消息传递来进行交互(消息传 递即激活指定的某个对象的方法,以改变其状态或让它产生一定的行为),最终完成复杂的任务。 3.一个类的使用过程,包括封装类,生成实例、使用实例进行三个操作3个过程。 4.一个类就是变量和相关方法的集合,其中变量表明对象的状态,方法表明对象所具有的 行为。 5.封装的类不是对象,要使用该封装的类进行操作,必须先生成这个类的一个实例------- 对象。对象的生成包括声明、实例化和初始化3个方面的内容。通常的格式为: ClassName objectName=new ClassName([paramlist]); ClassName 声明了一个类型为ClassName的对象。其中ClassName是组合类型(包括类和接口)。对象的声明并不为对象分配内存空间。 运算符new 为对象分配内存空间,实例化一个对象。new 调用对象的构造方法,返回对该对象的一个引用(即该对象所在的内存地址)。用new可以为一个类实例化多个不同的对象。这些对象占用不同的内存空间,因此改变其中一个对象的状态不会影响到其他对象的状态。 生成对象的最后一步是执行构造方法,进行初始化。由于对构造方法可以进行重写,所以通过对给出不同个数或者类型的参数会分别调用不同的构造方法 new 运算符返回对一个对象的应用,但与,C,C++中的指针不同,对象的引用是指向一个中间的数据结构,它存储有关数据类型的信息及当前对象所在堆的地址,而对于对象所在实际的内存地址是不可操作的,这就保证了安全性。 6.对于具有共同属性,又有自己特点的对象,就不能够通过单一的封装来实现了。此时可 以通过继承来实现。通过父类和子类,实现了类的层次,可以从最一般的开始,逐步特殊化,定义一系列子类。同时,通过继承也实现了代码的复用,是程序的复杂性线性增长,而不是呈几何增长。 7.继承是面向对象的基石,因为他允许创建分等级层次的类。运用继承,你能够创建一个 通用类,它定义了一系列相关项目的一般特性。该类可以被具体的类继承,每个具体的类都增加一些自己的特有的东西。在Java术语中,被继承的类叫做超类(supperclass),继承超类的类叫做子类(subclass)。因此,子类是超类的一个专用版本,它继承了超类定义的所有实例变量和方法,并且为它自己增添了独特元素。 继承是使用已经存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性的继承父类。 8.尽管子类包括超类所有的成员,但它不能访问超类中被声明为private的成员。只能被它 自己类中的其他成员访问,子类没有方法访问。 9.父类和子类的相互转换:在Java中可以将子类的引用赋给父类的对象,那么这时子类中 那些不是从父类继承来的成员将不再可见,我们可以再通过强制类型转换将这个父类再转换成子类类型,那些成员又变得可见了,由此可见,将子类引用赋给父类对象时,Java
浅析软件工程中面向对象的思想和方法 面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。在20 世纪60 年代以前, 软件开发者构造的软件系统大多都是较小的, 且相对简单。编程语言及编程环境也相对简单, 随着软件复杂性的增长, 为了更好地维护代码, 软件开发也需要方法来进行约束。传统的方法中, 结构化方法和基于建模方法是典型的软件开发方法。结构化方法是结构化分析、结构化设计和结构化编程的总称。结构化方法的思想萌发于20 世纪60 年代, 是在70 年代由Tom DeMacro 和Ed Yourdon 等人被系统地进出来。其目的在于, 提供一个有序的机制, 通过抽象来理解待开发的系统, 试图产生结构良好的软件系统。但对于较复杂的系统而言, 容易导致模块的低内聚和模块间的高耦合, 从面使得系统缺乏灵活性和可维护性。基于建模方法在20 世纪70 年代末提出, 即Peter Chen 的实体———关系法与Ed Codd 的关系数据库理论相结合提出的一种新的软件开发方法。其强调对信息实体建模, 而不是对象建模。结构化方法和基于建模方法都没有较强地描述系统的动态行为的能力。随着计算机技术的飞速发展, 计算机管理系统应用的普及, 企业信息化势在必行。传统开发方法结
构化开发的软件存在很多问题, 其有稳定性、可修改性和可重用性都比较差, 生产效率低等缺陷, 这是因为传统的软件开发是面向过程的。然而, 用户需求的变化大部分是针对功能的, 采用面向对象方法开发可以满足用户的需求, 因为面向对象有以下优点: 能够比较自然地反映现实事物, 可重用性、可维护性和可扩展性比较强。 第二章面向对象概述 什么是面向对象呢?“面向对象”本身没有任何意义。“对象”大概是英语中最普通的一个单词。它在字典中的定义是这样的。对象:能感觉到或能够被感觉到的东西。换句话说,对象可以是任何东西! “面向”也没有任何特别的含义,它的定义是“指向”。在这种定义下,“面向对象”被理解为形容词。因此,面向对象可以定义成这样,面向对象:指向你可以想到的任何东西。 毫无疑问,软件工业无法为“面向对象”下一个统一的定义。这种模糊性使得任何一个软件零售商都声称他们的商品是“面向对象”的。 2.1面向对象的基本概念 尽管权威人士对面向对象的概念没有达成一致的意见,但从程序设计方法的角度来看, 面向对象是一种新的程序设计范型。其基本思想是使用对象、类、封装、继承、关联、聚合、消息、多态性等基本概念来进行程序设计。
第一章概述 版权声明 此文档由王健旭(https://www.docsj.com/doc/a610505984.html, ginger547@https://www.docsj.com/doc/a610505984.html,)负责整理总结,并对该文档保有有限责任权利,此文档只能用于学习以及教学,请勿用作商业用途,因此而 产生的法律问题,本人一概不负责。本人声明,此文档资料为本人教学经验和网络资料收集合并之成果,如果在文档中引用了您的资料,而引起了侵犯您的权益的话,可以发送邮件知会,本人必定删除为是。 注:阅读此文档,不需要你是使用Java 的高手,但是已经假设你有了一定的Java 技术的基础。 JDK---JavaDevelopmentKittool JRE – Java Runtime Enverionment Path why:让系统通过读取path中的路径得到javac 和java所在的路径,从而执行 面向对象技术自上世纪60年代诞生以来已走过了40多年的历程。现在流行的开发工具、开发过程无不以面向对象技术为基础,可见面向对象技术的重要性。 基于类的面向对象语言是面向对象世界里的主流。它包括: Simula, 第一个面向对象语言 Smalltalk, 第一个支持动态类型的语言 C++, 它的大部分基于类的特性继承自Simula. 等等等等。 与基于类的语言相对应的是基于对象的面向对象语言。这里“基于对象”的概念和把Visual Basic叫做基于对象的概念是不同的。这里的“基于对象”是指一个只以对象为中心,没有类的概念的语言,类似Python之类的语言。
Java语言作为一门“全面”面向对象的编程语言,提供了面向对象的四种基本性质:抽象性、封装性、继承性和多态性。 面向对象主要有四大特性:封装、抽象、继承和多态。各自定义: 抽象(abstraction):抽象就是将一类实体的共同特性抽象出来,封装在一个新的概念(类)中,所以抽象是面向对象语言的基础。比如鸟就是一个对象,但是我们在研究这个对象的时候把它的一些同类放到一起,一起来考虑,而且抽象的时候,只考虑我们感兴趣的一些数据;假设你自己是一个普通人,那么你可能关心的数据是,鸟类飞行的方法,鸟类吃东西的方法;假设你自己是一个生物专家,那么你可能关心的数据时,鸟类的体重,鸟类的爪子的大小,鸟类的食量等等。 人们通过抽象处理复杂性。例如,人们不会把一辆汽车想象成由几万个互相独立的部分所组成的一套装置,而是把汽车想成一个具有自己独特行为的对象。这种抽象使人们可以很容易地将一辆汽车开到杂货店,而不会因组成汽车各部分零件过于复杂而不知所措。他们可以忽略引擎、传动及刹车系统的工作细节,将汽车作为一个整体来加以利用。 上帝造人: 封装(Encapsulation ):在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sleep()等行为,我们在行为中实现一定的功能,也可操作属性,这是面向对象的封装特性; 封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。理解封装性的一个方法就是把它想成一个黑匣子,它可以阻止在外部定义的代码随意访问内部代码和数据。对黑匣子内代码和数据的访问通过一个适当定义的接口严格控制。 继承(Inheritance ):继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类实体; 继承是一个对象获得另一个对象的属性的过程。继承很重要,因为它支持了按层分类的概念。例如,尊贵的猎犬是狗类的一部分,狗又是哺乳动物类的一部分,哺乳动物类又是动物类的一部分。如果不使用层级的概念,我们就不得不分别定义每个动物的所有属性。使用了继承,一个对象就只需定义使它在所属类中独一无二的属性即可,因为它可以从它的父类那儿继承所有的通用属性。所以,可以这样说,正是继承机制使一个对象成为一个更具通用类的一个特定实例成为可能。 可复用可维护性可扩展性 多态:多态性(Polymorphism ,来自于希腊语,表示“多种形态”)是允许一个接口被多个同类动作使用的特性,具体使用哪个动作与应用场合有关。多态就是通过传递给父类对象引用不同的子类对象从而表现出不同的行为,多态可为程序提供更好的可扩展性,同样也可以代码重用。
1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征:继承。封装。多态。特点:代码好维护,安全,隐藏信息 2.什么是https://www.docsj.com/doc/a610505984.html,中的用户控件 答:用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整. 3.列举一下你所了解的XML技术及其应用 答:XML可扩展标记语言,保存配置,站与站之间的交流,Web服务,https://www.docsj.com/doc/a610505984.html, 4.值类型和引用类型的区别?写出C#的样例代码。 答:基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。 所有的值类型均隐式派生自System.ValueType。 与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。 与引用类型不同,值类型不可能包含null 值。然而,可空类型功能允许将null 赋给值类型。 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。 值类型主要由两类组成:结构、枚举 结构分为以下几类:Numeric(数值)类型、整型、浮点型、decimal、bool、用户定义的结构。 引用类型的变量又称为对象,可存储对实际数据的引用。声明引用类型的关键字:class、interface、delegate、内置引用类型:object、strin https://www.docsj.com/doc/a610505984.html,中常用的对象有哪些?分别描述一下。 答: Connection 打开数据库连接 Command 执行数据库命令 DataAdapter 连接数据,执行数据库命令,填充DataSet DataSet 数据在内存中的缓存,数据结构 DataReader 只读向前的读取数据库
1、知识与技能 ( 1) 认识面向对象程序设计的基本思想和面向对象思想的由来, 并能够举例说明现实世界与面向对象系统之间的对应关系。 ( 2) 认识面向对象程序设计的优越性并初步理解其实现的机制。 2、过程与方法 经历分析、调试解决同一问题的两种不同实现思想的程序, 初步理解面向对象程序设计的优势及面向过程程序设计的缺陷。 3、情感态度和价值观 ( 1) 关注传统结构化程序设计存在的问题。 ( 2) 产生学习面向对象程序设计技术的愿望。 ( 3) 关注到面向对象技术是当前程序设计的重要发展方向。 二、重点难点 1、教学重点 ( 1) 传统结构化程序设计存在的问题 ( 2) 面向对象程序设计所具有的优点。 2、教学难点 ( 1) 面向对象思想的产生。 ( 2) 传统结构化程序设计与面向对象程序设计的基本点比较。 ( 3) 实现面向对象程序设计的基本机制。
1、教材处理 教材以广东教育出版社出版的信息技术( 选修一) 《算法与程序设计》第五章第一节内容为结构框架, 部分实例选取上海科教版的普通高中信息技术课程实验教材《算法与程序设计》, 力争做到说理透彻, 易于理解并提供较多的理论和实践操练以巩固所学内容。 教学方法采用采用讲解、任务驱动、实践和学生自主学习相结合的学习方法。 2、预备知识 学生已学完教材前四章内容, 基本掌握了传统的面向过程结构化程序设计方法, 有一定的程序设计基础, 课前建议学生预习课文内容, 初步了解本节教学内容与目标。 3、硬件要求 建议本节课在多媒体电脑教室中完成, 最好有广播教学系统或投影仪, 为拓展学习, 学生机应允许上互联网。 4、所需软件: 学生机要安装VB6.0或以上版本。 5、所需课时: 1个课时, 如无预习, 课程将较为紧凑。 四、教学过程 导入: 1、简要介绍本节课的教学目标: 认识面向对象思想的
对面向对象思想的理解与想法 一、面向对象的概念 所谓面向对象,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 二、面向对象思想的特点 1、信息隐藏和封装特性:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象仅通过一个受保护的接口访问其他对象。 2、继承:这是面向对象思想中最形象,也是最常用的一类层次模型,最大限度的实现了“类”的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3、组合特性:组合用于表示类的“整体/部分”关系。例如人的各个器官,如:头、胳膊、手脚等构成一个人。 三、关于面向对象思想的想法 通过学习,我认为面向对象的主要作用就在于化繁为简,面向对象的方法可以把以前冗长的代码缩减许多,最大程序的降低了代码冗余并提高了代码的复用性。原因就在于它的对象里面已经包含了需要执行的操作,主类就会变得很简洁。类似于通常说的“抽象”,看到一个物体,你知道它的形状,颜色,材质,你还可以知道它用来干什么。“知道用它来干什么”就是面向对象所不同的地方。 面向对象的编程语言最大的特色就是可以编写自己所需的数据类型,以更好的解决问题。我们必须搞清楚“类,对象,属性,方法”它们之间的关系。比如:“什么是人类?”人类所具有的一些特征,这些特征包括属性(一些参数、数值)以及方法(一些行为)。每个人都有身高、体重、年龄、性别等一些属性;人会说话,会写字,会制造工具,会直立行走等这些方法。人这个“类”是什么也做不了的,因为“人类”只是一个抽象的概念,它不是实实在在的“东西”,而这个“东西”就是所谓的对象。只有人这个“对象”才能去工作。而类呢?类是对象的描述,对象从类中产生出来,此时,对象具有类所描述的所有的属性及方法。而狮子、大象为什么不是人,因为它们不具备人这个类所具有的属性,狮子、大象不会直立行走,不会使用工具,所以说狮子、大象不是人。
面向对象七大设计原则 1、开闭原则 2、里氏替换原则 3、单一职责原则 4、接口隔离原则 5、依赖倒置原则 6、迪米特原则 7、组合/聚合复用原则 知识点关联 学习面向对象的设计模式,是深入面向对象思想的钥匙,通过大师级的微妙案例,我们可以开阔自己的认知。 在学习面向对象设计七大原则之前,我们要对基本的封装、继承、多态思想有足够的了解,对抽象类和接口也要有足够的编码能力,因为设计模式是以上知识点的综合应用。 另外,在接触具体的设计模式之前,面向对象的七大设计原则会让你知道,设计模式出现的必然性和意义所在。 1、每一种设计思想的精准含义,具体如下: 先从整体认识这七种设计思想。 一、开闭原则: 这一条放在第一位来理解,它的含义是对扩展开放,对修改关闭。解释一下就是,我们写完的代码,不能因为需求变化就修改。我们可以通过新增代码的方式来解决变化的需求。 当然,这是一种理想的状态,在现实中,我们要尽量的缩小这种修改。 再解释一下这条原则的意义所在,我们采用逆向思维方式来想。如果每次需求变动都去修改原有的代码,那原有的代码就存在被修改错误的风险,当然这其中存在有意和无意的修改,都会导致原有正常运行的功能失效的风险,这样很有可能会展开可怕的蝴蝶效应,使维护工作剧增。 说到底,开闭原则除了表面上的可扩展性强以外,在企业中更看重的是维护成本。 所以,开闭原则是设计模式的第一大原则,它的潜台词是:控制需求变动风险,缩小维护成本。 以下几种原则,都是为此原则服务的。 二、里氏替换选择: 此原则的含义是子类可以在任何地方替换它的父类。解释一下,这是多态的前提,我们后面很多所谓的灵活,都是不改变声明类型的情况下,改变实例化类来完成的需求变更。当然,继承的特性看似天然就满足这个条件。但这里更注重的是继承的应用问题,我们必须保证我们的子类和父类划分是精准的。 里氏替换原则的潜台词是:尽量使用精准的抽象类或者接口。 三、单一职责原则: 单一职责的含义是:类的职责单一,引起类变化的原因单一。解释一下,这也是灵活的前提,如果我们把类拆分成最小的职能单位,那组合与复用就简单的多了,如果一个类做的事情太多,在组合的时候,必然会产生不必要的方法出现,这实际上是一种污染。 举个例子,我们在绘制图案的时候,用“点”组成图和用“直线”组成图,哪个更灵活呢?一定是“点”,它可以绘制任何图形,而直线只能绘制带有直线条的图案,它起码无法画圆。
一、教学目标 1、知识与技能 ( 1) 认识面向对象程序设计的基本思想和面向对象思想的由来, 并能够举例说明现实世界与面向对象系统之间的对应关系。 ( 2) 认识面向对象程序设计的优越性并初步理解其实现的机制。 2、过程与方法 经历分析、调试解决同一问题的两种不同实现思想的程序, 初步理解面向对象程序设计的优势及面向过程程序设计的缺陷。 3、情感态度和价值观 ( 1) 关注传统结构化程序设计存在的问题。 ( 2) 产生学习面向对象程序设计技术的愿望。 ( 3) 关注到面向对象技术是当前程序设计的重要发展方向。 二、重点难点 1、教学重点 ( 1) 传统结构化程序设计存在的问题 ( 2) 面向对象程序设计所具有的优点。 2、教学难点 ( 1) 面向对象思想的产生。 ( 2) 传统结构化程序设计与面向对象程序设计的基本点比较。 ( 3) 实现面向对象程序设计的基本机制。
三、教学环境 1、教材处理 教材以广东教育出版社出版的信息技术(选修一)《算法与程序设计》第五章第一节内容为结构框架, 部分实例选取上海科教版的普通高中信息技术课程实验教材《算法与程序设计》, 力争做到说理透彻, 易于理解并提供较多的理论和实践操练以巩固所学内容。 教学方法采用采用讲解、任务驱动、实践和学生自主学习相结合的学习方法。 2、预备知识 学生已学完教材前四章内容, 基本掌握了传统的面向过程结构化程序设计方法, 有一定的程序设计基础, 课前建议学生预习课文内容, 初步了解本节教学内容与目标。 3、硬件要求 建议本节课在多媒体电脑教室中完成, 最好有广播教学系统或投影仪, 为拓展学习, 学生机应允许上互联网。 4、所需软件: 学生机要安装VB6.0 或以上版本。 5、所需课时: 1 个课时, 如无预习, 课程将较为紧凑。 四、教学过程 导入: 1 、简要介绍本节课的教学目标: 认识面向对象思想的由来及