ITjob就业培训java教材02.docx

上传人:b****7 文档编号:9737419 上传时间:2023-02-06 格式:DOCX 页数:18 大小:229.40KB
下载 相关 举报
ITjob就业培训java教材02.docx_第1页
第1页 / 共18页
ITjob就业培训java教材02.docx_第2页
第2页 / 共18页
ITjob就业培训java教材02.docx_第3页
第3页 / 共18页
ITjob就业培训java教材02.docx_第4页
第4页 / 共18页
ITjob就业培训java教材02.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

ITjob就业培训java教材02.docx

《ITjob就业培训java教材02.docx》由会员分享,可在线阅读,更多相关《ITjob就业培训java教材02.docx(18页珍藏版)》请在冰豆网上搜索。

ITjob就业培训java教材02.docx

ITjob就业培训java教材02

第二章:

面向对象概述

学习目标

⏹掌握什么是面向对象以及面向对象的主要特点

⏹了解OOA、OOD、OOP的概念以及之间的关联

⏹了解面向对象程序语言的发展简史

面向对象(ObjectOriented)

面向对象是一个广泛使用但涵义并不清晰的术语。

上世纪80年代面向对象主要指一种程序设计方法,但在随后的发展中,面向对象的方法已经渗透到计算机软件领域的许多分支。

在了解面向对象之前我们必须得了解两个重要概念:

对象和类。

什么是对象?

首先,我们来了解一下什么是对象。

对象的概念最早出现于五十年代人工智能的早期著作中,在现实世界中,我们可以将对象定义为:

对象(Object):

一个具有明确行为的有形实体,具有行为和状态,有着清晰的边界。

以面向对象的眼光来看待现实世界,现实世界中的每一个具体事物,我们都会将其看作一个对象,比如狗、电视机、自行车等,都可以是对象。

狗有特定的名称、毛色、品种、会饿等特点,还有狗叫、尾巴左右摇摆等动作;同样的,自行车也有品牌、重量等特点,同时具备换速、刹车等动作;依此类推,我们不难发现,现实中的每一个对象都会有自己的特点以及相关动作,我们将对象所有特点(属性)称之为对象的状态,而动作称之为行为。

属性(Attribute):

对象的一种内在的或独特的性质、特点、质量或特征,它构成了一个独一无二的对象(摘自<>)

每一个学生具备名称、性别、年龄、身高、长相、爱好等属性,通过这些属性我们可以很快地区分所有的学生对象,因为这些属性构成了每一个独一无二的学生对象。

比如说,在大部分情况下,我们会通过学生名称来区分每一个学生对象。

我们经常会说:

某某人很高,某某人很年轻等,高和年轻实际上就表现出某一个对象的内在的特点。

因此,可以这样理解,我们是通过每一个对象特有的属性来区分各个对象。

注意:

属性都有其对应的值,而且某些属性值是可以动态改变的,比如学生的体重、爱好是可以改变的,而DNA、指纹却是不能改变的。

随着属性值的改变,状态也随之改变了。

比如,学生甲的身高值逐渐增长了,那学生甲的状态也发生了变化----长高了!

状态的具体定义如下:

状态(State):

包含对象的所有属性以及属性值,会随着属性值的改变而改变。

没有一个对象是孤立存在的,对象之间是相互作用的。

行为就是指这种作用。

行为(Behavior):

是一个对象根据它的状态改变和消息传送所采取的行动和做出的反应,代表了对象对外的可见、可测试的动作。

(摘自<>)

行为和状态是相互的。

Dog处于饿的状态时,就会采取进食等行为,进食完毕后,Dog又会处于饱的状态。

现实中,大多对象是通过接受另一个对象传递的一个消息(操作)来改变自身的状态。

比如:

驾驶员扭动汽车启动钥匙至关闭位置,此时,汽车关闭引擎。

其中,驾驶员、汽车都是对象,而关闭引擎则是一个特定消息,是由驾驶员传递给汽车的消息,汽车根据这个消息改变状态---从启动状态变为关闭状态。

因此,消息实际上就是一个对象对另一个对象施加的操作。

小练习

列举现实生活中5种对象以及相关的属性和可能的行为?

在软件开发中,对象一词的正式应用是在Simula*语言中,在Simula中对象是用来描述现实的某个方面。

对象的范围更广,除了现实中描述的对象之外,还包括在软件设计中产生的一些产物,这些产物一般用来实现更高级的行为功能。

Simula--20世纪60年代产生的一种面向对象语言,是所有基于对象和面向对象语言的原型,用于描述系统和开发仿真的语言。

在软件中,对象代表一个单独的、可确认的实体,可以是具体的也可以是抽象的,必须有明确定义的一个这样的角色。

相似对象的属性和行为在它们的共同类中定义。

在软件中,对象可能有很清晰的边界,然而却是抽象的;也可能是具体存在的,但边界不明确。

注意,软件中的对象和现实中对象同样有其自身的状态和行为!

每一个对象在软件中都会拥有自己的空间(内存)和唯一标识名。

一般,我们也将对象称之为实例(instance)。

通俗地讲,对象指的是客观世界中的实体,它能"知道一些事情"(即存储数据),"做一些工作"(即封装服务),并"与其它对象协同"(通过交换消息),从而完成(模块化)系统的所有功能。

对象反映了系统保存和处理现实世界中某些事物的信息的能力。

什么是类?

在现实世界中,我们会将所有脊椎动物对象进行分类:

鸟类、两栖爬行类、哺乳类,比如我们将leopard、tiger、monkey等脊椎对象都归纳为哺乳类,而eagle、crane、swan属于鸟类。

那我们又是怎样去判断哪种动物是属于哪一类的?

我们发现,leopard、tiger、monkey都具备viviparity(胎生)、lactation(哺乳)、coat(皮毛)等哺乳动物特征,而eagle、crane、swan却具备feather(羽毛)、flight(飞翔)、beak(喙)等鸟类特有的特征。

不难发现,。

这些对象都具有一些共同的属性和行为,通过这些属性和行为的划分,我们将leopard、tiger、monkey划分为哺乳类,而eagle、crane、swan划分为鸟类。

类和对象是紧密关联的,没有对象就没有类!

类的定义:

类(Class)是一组共享公共属性和公共行为的对象的集合。

类可以是一种抽象,是一个蓝图,即可以不具体存在;它实际上是对一组对象的公共部分的归纳集合,而对象却是一个具体的存在,是实体而非抽象。

我们可以这样说:

类Mammal代表所有哺乳动物的共有特征,所有的非公有特征都不属于类Mammal,比如皮毛的颜色、喜好的食物等都不会归纳到类Mammal。

而当我们想去识别某个特定的哺乳动物时,就必须指定"这个哺乳动物"或者"那个哺乳动物",即对象,也就是说,当我们需要去分析哺乳动物特有的属性和行为时,那就必须针对具体的对象来研究,而不是针对一个抽象的类!

注意:

在软件开发中,我们将一个对象称之为类的一个实例。

没有公共结构和公共行为的对象,我们不能将它们组合在一个类中。

比如,我们都知道不能将pinaster和squirrel组合成一个类,是因为pinaster和squirrel并没有共享结构和公共行为,比如pinaster有枝叶而squirrel没有,squirrel能行走而pinaster不能等等。

在现实世界中,我们认识事物的时候都是首先将所见事物进行分类,然后按照每种类别去逐一研究事物对象。

同样,在软件领域中,我们也是将问题进行分解分类(将大问题分解成许多小问题,每个小问题可以归纳为一类),然后再针对每一类进行分析设计以及实现,这就是广义的面向对象。

面向对象定义:

尽量模仿现实世界,在软件中将复杂问题中的实体都作为一个对象来处理,然后根据这些对象的结构和行为再划分出类(即实现问题的分解),最后实现软件的模拟仿真。

也可以理解为:

现实世界中的实体抽象成模型世界、程序世界中的对象和类,设计它们以完成预期任务并具有更好的可维护性和健壮的结构。

注意:

在软件领域中,类包含了对象的属性和行为的定义,是一组属性和行为操作的集合!

只有掌握了对象和类的概念,我们才能清晰、准确地明白什么是面向对象!

当然,对面向对象的深入了解还必须掌握面向对象的一些相关特性,在下一小节我们将具体学习。

面向对象的主要特性

程序语言发展到如今,已出现了多种风格不一的编程语言,大体主要分为以下两种风格的语言:

⏹面向过程(以C语言为代表)

⏹面向对象(Java、Smalltalk、C++等)

并不是说哪种语言是最好的,每种风格语言的好坏是针对不同方面的应用程序而言的。

比如说,面向过程语言适用于计算密集型操作(复杂算法等)的设计,而面向对象适用于广阔的应用程序范围(这也是Java能迅速发展并占据广大市场的原因之一)。

面向过程(ProcessOriented):

基于该风格的程序的设计都是在想怎样才能一步一步的解决问题,思维方式是过程,或是说步骤。

那怎么区分面向过程和面向对象的区别,只要是具备以下特点的语言我们都可以将其看作为实现了面向对象的语言:

抽象(Abstraction)

在前面,我们已知道通过抽象创建出了类,类就是抽象的一种表示。

抽象是解决问题复杂性的一种基本方法,抽象会重点强调我们应该注意什么,而不应该注意什么!

通过抽象我们可以着重实现需关注的细节而忽略一些非实质性或无关紧要的细节,从而能够更好的分析问题解决问题!

抽象:

表示一个对象与其它所有对象区别的基本特征,为不同的观察者提供不同的角度来观察对象。

对同一个对象---电视机,维修员只会关注电视机的内部结构:

线路是否断裂、显像管是否损坏等,而购买电视的客户却只会关心电视机的画面是否逼真、外观是否好看等等,客户不会也不用关心电视机的内部结构。

可以看出,维修员只关心电视机的内部,购买用户只关心电视机的外观及实用性,他们观察电视机的角度不一致,这就是抽象的实现,在现实生活中,到处都存在着抽象!

抽象强调实体的本质、内在的属性,在软件开发中,抽象指的是在决定如何实现对象之前对对象的意义和行为的定义----即类的实现!

通过对类的了解,我们也可以将抽象定义为:

从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征。

为什么需要抽象?

首先,问题的复杂性日益增长,其中描述的事物也越来越复杂,如果分析员去了解每一个事物的所有方面,那将是一个穷举耗时、低效率的工作

其次,如果没有识别所有对象的共同特征的行为,那么对这些对象的分类将无法进行!

对象分类是面向对象中非常重要的环节,而抽象则是实现该环节的必须解决方案!

抽象的本质就是将问题分解,在面向对象中,所有对象被抽象成各种类,从而让程序员集中关注于功能的实现!

小练习

列举现实生活中的抽象例子,最少3例。

封装(Encapsulation):

我们再来思考上面的例子,对于客户来说,他只会关心电视机的外观及性能是否良好等方面,电视机中的显像管、集成电路板对客户而言是不可见的,即电视机的生产商已将这些配件通过电视机外壳包装了起来,对客户,配件是隐藏的!

现实中,这样的例子很多,比如计算机对于购买者而言,其组成部分CPU、Mainboard、HD等PC配件都被封装在机箱内,是不可见的!

封装:

是一种信息隐蔽技术,是一个划分抽象的结构和行为的过程。

封装和抽象是互补的,抽象着重于对象的行为,而封装着重于对象的行为的实现。

抽象实现抽取众多对象的公共特征和行为,而封装则是在不同的抽象之间设置明显的分隔线,从而导致每一个观察者关注内容的明显分离!

没有抽象的封装将无意义;没有封装的抽象是不完整的!

在开发中,封装可以更通俗的理解为:

把代码和代码所操作的数据捆绑在一起,使这两者不受外界干扰和误用的机制,封装可被理解为一种用作保护的包装器,以防止代码和数据被包装器外部所定义的其他代码任意访问,对包装器内部代码与数据的访问通过一个明确定义的接口来控制。

封装代码的好处是每个人都知道怎样访问代码,进而无需考虑实现细节就能直接使用它,同时不用担心不可预料的副作用。

继承(Inheritance)

类和类之间的关系之一,是面向对象系统的最基本要素。

继承表明为一个"是一种"的关系,在现实中有很多这样的例子:

人类是一种哺乳动物;树是一种植物类…….。

为什么人类是一种哺乳动物?

答案:

因为人类具备所有哺乳动物的特征(结构和行为),也就是说,人类继承了哺乳动物的特点!

我们经常会这样描述:

儿子继承了父(母)亲的优(缺)点!

继承:

一个类共享一个或多个类中定义的结构和行为,表示的是一种泛化/特化的层次关系。

注意:

类和类之间实现继承的前提是这些类之间有着必然的联系---"类A是一种类B"!

假如:

我们将树继承于哺乳动物,而人类则继承于植物类!

大家想想看,结果会如何?

我们在使用继承的时候必须得遵守这样的检验标准:

如果类B"不是一种"类A,那么类B必然不是从类A继承而来!

⏹当类B继承于一个类A,那么这种继承称之为单继承。

⏹当类B继承于多个类A、C、D等,那么这种继承称之为多继承。

也可以这样理解,当实现单继承时,那类B继承了类A的所有属性和方法(比如人类继承了哺乳动物的所有属性和行为);而实现多继承时,类B继承了A、C、D等多个类的所有属性和方法(比如儿子继承了母亲和父亲的所有优、缺点)。

其中,类B称之为子类(派生类)subclass,而类A、C、D则称之为超类(父类、基类)superclass

泛化(generalization):

将一些有关联的不同类中的共同结构和行为抽取出来,构成一个新的超类。

特化(specialization):

和泛化正好相反,从一个或者多个超类中派生出多个子类。

简单理解就是:

超类的创建代表泛化,子类的派生代表特化!

子类除了能通过继承共享父类的属性和行为之外,还能修改继承于父类的属性和行为,最重要的一点就是:

能在继承父类的基础上定义属于子类自身的属性和方法,从而实现扩展!

以上这段话就是继承的最神奇之处!

面向对象使继承得到了充分的体现!

学习技巧:

大部分同学在初学时往往对继承、抽象等概念一知半解,建议大家多结合实际例子来学习,可以多想想周边的现实世界中哪些是继承、哪些是抽象。

多态(Polymorphism)

我们来假设思考一下现实中的一个问题:

假设,某条snake和某条cabrite,它们都取名为Jack,注意,snake和cabrite有着共同的超类---爬行类,都具备爬行类的公共行为:

爬行。

但我们发现,虽然一个名字Jack代表两种不同类对象,但是这两个对象却是用不同的方式来爬行,Jack(snake)通过蠕动身上的鳞片来爬行,而Jack(cabrite)则通过四肢来爬行。

虽然,在现实中我们可以通过给这两个对象取不同名字用以区分,但上面的例子向我们演示了这样一个过程:

一个名字可以表示许多不同类(这些不同类必须拥有一个共同的超类)的对象,从而实现以不同的方式来响应某个共同的操作集。

以上就是多态的定义,多态只有通过继承才能实现!

在后面章节我们会详细掌握多态以及其运用。

以上就是面向对象的一些主要特征,具备了这样特征的程序语言我们就可以称之为面向对象语言。

面向对象的优点

先来看一下软件复杂性,软件固有的复杂性:

⏹维护过于困难

⏹修改每一个地方将会牵涉到许多功能模块的变动,复杂性加大。

⏹过于僵硬,扩展困难

⏹由于系统的关系错综复杂,很难添加新的功能。

⏹重用率过低,导致大量冗余

⏹在每个项目中往往会出现大量的代码冗余,不能很好的重用。

⏹耦合度过高,导致理解、修改困难

⏹每一个程序之间联系过于密切(强耦合),增加了阅读和修改的复杂性。

一个好的系统应该具备如下的性质:

可扩展性、灵活性、可插入性。

--PeterCode[CODE99]

通过面向对象就能很好的处理以上的复杂性。

在面向对象过程中,我们根据问题领域中的关键抽象来分解系统,识别关键对象并将其分类,最终达到将复杂问题分解成多方面来分析和实现。

比如,PC机就是一个很复杂的设备,为了更好的了解PC,我们就会将PC的组成部分分解,再逐一了解,从而达到复杂问题简单化。

PC包含CPU、display、keyboard、HD等,通过对这些部件的逐一熟悉,PC就不会显得很复杂了。

而且,如果我们只想了解PC的处理速度,那么就只需专注于对CPU的了解(通过抽象来实现)。

面向对象是一种尽量模仿现实世界的思想,以上对PC的了解就是我们在现实中对一个复杂事物进行分解熟悉的一个过程,面向对象就是这样的一个过程,只是复杂许多。

面向对象的一些主要优点:

⏹和现实世界更接近,更符合我们人类的思维逻辑

⏹开发出的系统容易维护和修改

⏹适用于开发复杂、庞大的系统

⏹开发出的程序更稳定合理

⏹由于继承、类的机制,更容易实现重用,减少冗余

⏹由于实现数据和逻辑的分离,维护和扩展变得更加容易

面向对象的分析、设计和编程

在面向对象开发中,一般都会遵循三方面来分析解决问题:

⏹首先,通过一些好的方法对问题进行分析,寻找问题中的对象实体、类。

⏹其次,基于分析结果使用类和对象抽象在逻辑上构建系统,实际上就是使用面向对象的各种分解方法来建立系统的逻辑、物理模型和动态、静态模型。

⏹最后,就是运用不同的面向对象语言对设计的结果的实现,即类和对象的实现。

下面我们就这三方面具体来学习。

面向对象分析(Object-OrientedAnalysis)

面向对象分析(OOA)方法是建立在对象及其属性、类属及其成员、整体及其部分这些基本概念的基础上。

大英百科全书指出:

人类在认识和理解现实世界的过程中普遍运用着三个构造法则:

a.区分对象及其属性。

例如,区分一棵树和树的大小或空间位置关系。

b.区分整体对象及其组成部分。

例如,区分一棵树和树枝。

c.不同对象类的形成及区分。

例如,所有树的类和所有石头的类的形成和区分。

OOA就是建立在以上三个原则的基础上的,每个软件都建立在特定的现实世界中,OOA阶段产生的模型就是用来形式化该现实世界的"视图"---我们称之为建模。

有许多优秀的方法作用于整个OOA阶段,如Shlaer-Mellor,Jacobson,Coad-Yourdon,Charles,Abbott等,还有现今已成为建模主流的UML(UnifiedModelLanguage)。

OOA就是仔细的划分系统的各个部分,明确它们之间的层次关系,然后将各个部分作为一个对象进行功能上的分析的一个过程。

包括业务分析和需求分析。

OOA:

是一种分析方法,它以可在问题域的词汇表中找到的类和对象的观点来理解、审视需求。

(摘自<>第二版)

虽然面向对象分析和面向对象设计的侧重点很不相同,但二者之间的界限是很模糊的,在开发中,我们往往不能明确的区分二者的范围。

从上面的描述可以知道,在分析中,我们通过发现构成问题域中的词汇表来寻找类和对象,从而模拟现实世界对软件建模。

OOA阶段的方法众多,各有其特点,这里我们只介绍一种最简单的方法:

非形式化的语言描述。

这个方法是由Abbott提出,他建议用语言(英语)写出问题的描述,接着在名词和动词下面划线;名词代表对象,动词代表对象的操作。

例子

描述一个顾客购买机票的场景。

顾客选择某一个柜台,首先顾客向柜台助手查询某一天的航班信息以及是否有机票预订,柜台助手往电脑里输入查询信息并查看结果,如果有机票,顾客则填写预订表预订机票,柜台助手输入预订信息并打印机票,最后将机票返回给顾客。

单下划线代表对象,双下划线代表操作。

通过Abbott方法我们可以分析出该场景中的对象和操作,名词:

顾客、柜台助手、航班信息、机票、查询信息、机票;动词:

查询、预订、打印。

在使用UML建模时,OOA阶段主要是通过另一种方法---用例分析来实现系统的用例图以及简单类图和时序图等,既UML是将系统用一种统一标准的图形来表示(在后期会专门学习)。

面向对象设计(Object-OrientedDesign)

OOD是对OOA的细化,强调的是复杂系统的正确和有效的构建,通过不同的方法来着重于系统的逻辑设计、物理设计。

如果说分析是产生系统的类和对象,那么设计则确定类和类之间的关系、对象和对象之间的关系、类的状态转换、模块之间的依赖性等。

OOD特点

⏹没有严格的界线

⏹OOD的结果直接用于编码

⏹与OOA的输出一样,只是更加详细完善

OOD:

是一种设计方法,包含面向对象分解的过程以及一种表示方法,用来描述设计中系统的逻辑与物理模型和动态与静态模型

OOD步骤

⏹细化重组类

⏹细化和实现类间关系,明确其可见性

⏹增加属性,指定属性的类型与可见性

⏹分配职责,定义执行每个职责的方法

⏹对消息驱动的系统,明确消息传递方式

⏹利用设计模式进行局部设计

⏹画出详细的类图与时序图、状态图、对象图等(UML)

OOD与OOA的区别

⏹OOA偏重于理解问题,描述软件要做什么,而OOD偏重于理解解决方案,描述软件要如何做

⏹OOA只考虑理想的设计,不关心技术与实现底层的细节,而OOD需要得到更具体详细更接近于真实的代码的设计方案

⏹在设计结果的描述上,OOA偏重于描述对象的行为,OOD偏重于描述对象的属性与方法

⏹OOA只关注功能性需求,OOD还需要关注非功能性需求

一个设计的好坏直接决定程序的成败,因此,在往后的项目实战中,大家一定要全面、仔细、合理的进行设计。

面向对象编程(Object-OrientedProgramming)

OOP是对设计的一种代码实现方法,在该阶段,我们将采用合适的面向对象语言来编码实现设计阶段产生的系统架构。

OOP:

是一种实现方法,程序被组织成对象的协作集合,每一个对象代表某一个类的实例,而类则是通过继承关系联系在一起的。

OOP阶段必须满足三个标准条件

⏹使用对象而不是算法(面向过程则是使用算法)作为其基本逻辑构件

⏹任何一个对象都必须是某一个类的实例

⏹类通过继承关系和其它类相关

OOP的关键就是面向对象语言的选择以及面向对象特点的实现。

实际上,有很多程序员对面向对象和基于对象(Object-Based)的语言概念很模糊,容易混淆。

当一种语言满足以下条件时才能称之为面向对象语言:

⏹对象必须是数据的抽象

⏹每一对象对应相关类

⏹子类可以从超类中继承属性和方法

如果某种语言只满足了以上的前两个条件,而第三个条件并没满足(如JavaScript语言),那么我们就将该语言称之为基于对象的语言。

面向对象语言的发展简史

编程语言从最初的复杂机器语言发展到如今的高级面向对象语言,经历了近50年的历史,其中,产生了四代计算机语言:

⏹第一代:

(1954-1958)

FortranI、ALCOL58、Flowmatic等语言,主要应用于数学和工程应用,几乎全部使用数学词汇。

⏹第二代:

(1959-1961)

FortranII、ALCOL60、COBOL、Lisp等语言,重点在于算法抽象,集中于告诉机器应该做什么,比如通过这些语言编写的算法会告诉机器应该在查看员工数据之前进行排序。

⏹第三代:

(1962-1970)

PL/1(FORTAN+ALCOL+COBOL)、Pascal、Simula(最早出现类和对象的思想的语言),对数据(类)抽象,描述各种类的类型。

⏹第四代:

(1970-至今)

Smalltalk、C++、Ada、Java、Eiffel、PHP等语言,都是面向对象或基于对象的语言。

发展到至今,高级语言已出现了2千多种,现在仍在不断出现(如Ajax等新语言),呈一个高速发展阶段,而现今主流的语言就是我们所学的面向对象语言,对于复杂的问题面向对象语言能比任何其他种类语言更好的解决,其中的代表性语言是-Java。

Simula是最早出现类和对象的基本思想的语言,后期产生的各种面向对象或者基于对象语言均是从Simula语言的基础上发展而来。

比较典型的有:

Java(纯面向对象)、Smalltalk80(纯面向对象)、C++(面向对象)、ObjectPascal(面向对象)、Ada(基于对象)等。

对象不是类,类却可以是对象,请思考是否正确

对象之间的关系

⏹上下级关系

对象之间的一个物理或概念联系,一个对象通过它与另一个对象之间的上下级关系协作,通过上

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1