本次学历提升截止时间

0508

成人本科学历报考通道国家正规/学信网可查/含金量高
2022年学历考试
报考指导手纲(新)

计算机等级二级Java考试辅导:“面向对象”单元综合复习

作者:成人自考 发布时间:2025-10-13 08:11:36点击:

     

1、请简要说明面向对象程序设计方法的基本思想

(1)面向对象(Object Oriented)和面向对象编程(Object Oriented Programming)

面向对象(Object Oriented ,OO)是一种编程思想,而面向对象编程(Object Oriented Programming ,OOP)则是一种编程技术。OOP主要是使用对象、类、继承、封装、消息、多态等基本概念来进行程序设计,OOP基于OO对世界的认知和看法的相关思想。

因为从OO的角度来看世界中的万事万物都为“对象”,正如哲学家告诉我们:世界是由“相关联”的“物质”所组成的;而面向对象领域的专家则告诉我们:世界是由“对象”所构成的,并且它们是由一组彼此相关并能相互通信的实体(Object,对象)所组成。

正是由于世界中的万事万物之间都有一定的“关系”,当然在面向对象中所涉及的对象之间也存在有一定的关系(联系),这些关系也就是这些对象所对应的自然界中“事物”之间的自然关系。

在面向对象领域,将这些关系归纳总结为如下几种形式:“关联、依赖、组合和继承”。如下示例图所示的UML类图表示“计算机”和“PC电脑”、“CPU”、“硬盘”、“打印机”、“计算机用户”以及计算机处理的“数据”之间所存在的不同形式的关系。

尽管UML类图对普通的人来说有点“深奥”,但普通人对这些“事物”(也就是面向对象中的对象)之间的自然关系应该是能够理解和熟悉的。阅读本文的读者对这些关系更不会感觉到陌生,但问题是能否将这些关系直接通过某种语言的程序代码来体现出,或者说程序员在编程解决某个问题的程序时,能否依据所要解决的问题的“自然特性”和自然的“相互关系”去构建对应的程序代码,而不要再像以前哪样以计算机处理流程、适配机器的存储格式等要求为目标而编程。

一旦能够采用这样的“自然方式”进行编程,首先,程序员在编程的思维方面能够继续采用人的自然思维而不再迎合机器的数据处理要求编程(相信有过汇编语言编程经历的读者应该深有体会!)。思维一旦得以回归,解决问题也就会“得心应手”;其次,编程简单、程序结构和关系都容易被理解。

基于此应用的要求,在IT界出现了面向对象的相关概念、思想等(当然,这些都是在上个世纪发生的),随后又出现了基于面向对象思想的程序设计方法——面向对象编程。

(2)面向对象程序设计方法中所依据的面向对象相关的基本思想

1)一切皆为对象(Everything is anObject),万物皆对象

更准确的说法应该是“万物皆为对应类型的对象”,人类对自然界的认识和理解是基于“分类”的概念基础之上的,通过“分类”更容易认识和了解一类事物的特性——把众多的事物归纳、划分成一些“类型”是人类在认识客观世界时经常采用的思维方法(如人、计算机、教室、学生和教师等)。基于此,在面向对象领域中也就自然地产生出了“类”与“对象”这两个术语。

读者对“人”与“我”这两个概念是非常熟悉的,“人”代表在地球中生活的各个地区、各个国家及各个民族中的人;而“我”却是“人”中的一个特定的“个体”(特例、个例、实例等)。通过“人”与“我”之间所反映出的“共性”和“个性”之间关系,读者也就能够很容易地理解面向对象领域中的“类”与“对象(对象实例)”之间的关系。

2)万物皆可分类、万物都有共性和个性

为此,在面向对象领域则提出如下的技术实现手段:对相关事物(对象)的共性部分(特征,数据量,属性)和(行为,功能,方法)进行抽象(提取出),然后再打包组合形成一个类。

面向对象领域中的“类”,它其实是反映一类具有相同属性和方法的一组实体(对象)的集合,它为属于该类的所有实体(每个特定问题)提供一个“统一的抽象描述”。为此,又出现了“抽象”和“封装”这两个术语。

面向对象的程序员在应用开发时,基于对所要解决的问题的“理解”和问题之间的自然“关系”,对所要解决的问题进行“抽象”分析,提取出该类问题相关的“特征”和“行为”,然后再应用生活中的“包装(打包)”等手段将“特征”和“行为”再组合,产生出类(类型)。

以上所述的这些概念如何在计算机中表现出,并能够适应计算机的处理流程?为此,产生了基于面向对象设计思想的各种编程语言——面向对象编程语言,比如C++、Java、C#等,借助于这些语言描述上述的各种概念。在Java语言中,将抽象出的“特征”采用各种类型的“变量”来表示,形成“属性”;将抽象出的“行为”采用各种形式的函数(功能、function等)来表示,形成“方法”。

最后通过类定义的形式将“属性”和“方法”组合在一起,形成一个封装体,类的定义体也就产生。因此,各种面向对象语言中的类定义,其实就是“封装”的具体技术实现。类定义中的“{}”其实就体现封装的“边界”。

3)万物皆有层次性,万物之间的关系不仅体现在横向方向,也表现在纵向方向上

“你”、“我”、“他”或者“她”更多地体现出人与人之间的横向关系(同一层次中的各种关系),而“爷爷”、“爸爸”、“儿子”则体现出人与人之间的纵向关系。在面向对象领域如何解决或者描述出问题所具有的“层次性”的关系?为此,产生了“继承”和“派生”这两个术语。

面向对象领域中的“类”并不是孤立的,可以在某个类的基础上,依据问题之间所存在的自然的层次性关系产生出对应的派生类(子类)。也就是说,不同层次的类通过继承(extends)不仅体现出这些类所对应的问题之间的层次性关系,而且还可以共享上层类体中所抽象出的共性内容(继承)。

通过不断地归纳共同部分和依据问题的层次性的级别关系,就可形成不同层次的类(某个父类其实也就是另一个父类的子类)。面向对象领域中的“继承”和“派生”不仅很好地解决了如何描述自然界中的层次性的事物等问题,而且在程序设计方面可以很好地实现“重用(复用)”的效果,这包括“设计思想”、“编程方法”、“系统架构”和“程序代码”等多个方面的重用(复用)。

4)万物之间通过消息进行交互和反应

人与人之间(也就是“你”、“我”、“他”、“她”之间)通过“交流”进行沟通和交互,并作出对应的反应,沟通和交互等行为在本质上其实就是“发送消息”和“接收信息”,并对所接收到消息进行反应。人与人之间不仅是通过消息进行进行沟通和交互,人与动物(你家的宠物)之间也是通过消息进行沟通和交互(“你”与“它”之间),万物之间通过消息进行交互和反应!

在面向对象领域,产生了“消息”这个术语(但作者认为更准确的术语应该是“调用、请求”)。对象与对象之间通过消息进行相互交互和反应。一个对象要应用另一个对象中的功能(方法),就需要向该对象产生“调用”的请求,请求中包括待调用的功能名称、入口参数和期望接收到结果等信息。目标方法在“请求”的驱动下完成特定的功能行为,并返回对应的结果给调用的对象。

5)万物的共性皆有不同的形态,世界是多姿多彩的

尽管一类事物有共性的特征和行为,但此共性的行为在不同层次的事物中,又可能会表现出差异性。比如几何图形中的“点”具有一个“画”的功能(draw),当然此处的“画”的功能肯定是画出自己(点)。而圆则是对点的进一步扩展,是点的子类,圆也有一个“画”的功能(draw),当然此处的“画”的功能肯定也是画出自己(圆)。因此,万物尽管有共性,但对外却有不同的形态,从而构成缤纷多彩、多姿多彩的世界。

在面向对象领域,如何体现或者反映出世界的“丰富性”?产生了“多态”这个术语。面向对象领域中的多态是指“方法同名”但“方法体不同,也就是不同的功能实现”,在父类中定义的方法被子类覆盖后,可以给出不同的行为功能实现。反映在具体的编程实现方面,就是在父类中提供一种方法的原型定义或者初步实现,但要求在子类中对该方法加以重写并给出自己的实现,从而对“共性”进行重用,对“个性”进行扩展。

在面向对象的各种语言中,对多态的实现基本上都基于两种方式:应用接口和应用继承派生。如果采用接口的方式实现多态的应用效果,则要求在实现类中实现所对应的接口中的所有成员方法,并且不同的实现类,可以产生出不同的功能实现的结果;而如果采用继承的方式实现多态的应用效果,在子类中可以覆盖上层基类的成员方法,并且不同的子类可以产生出不同的功能实现结果。

因此,面向对象程序设计方法通过“多态”,不仅反映了“世界的多彩性和丰富性”。在程序设计的具体技术方面,一方面是为了能够处理不同层次的问题,当处理的问题在类型方面有层次结构时,开发者常常不希望把对象看作是某一特殊类型的对象,而把它看作是基类的类型对象(某种“通用的类型”对象或者是某种“泛泛的类型”);另一方面,可以提供通用的功能实现代码,个性化或者特殊性的功能实现代码则留给问题的最终解决者根据应用的要求灵活地实现,应用多态可以使得开发者能够编写出不依赖于特殊类的类型的代码,使得程序具有更好的通用性。

(3)为什么要应用面向对象的思想进行软件应用系统的开发

读者要理解这个问题,需要首先明确传统的软件开发方法所存在的问题,比如面向过程的程序设计方法(代表的语言为C语言)或者更早的面向机器的程序设计(代表的语言为汇编语言)。熟悉C语言编程或者应用过8086汇编语言的读者对下面的各种问题,应该会深有体会。

1)软件重用性差,因为在这些程序设计方法中没有提供“封装”和“模块化”等编程的实现机制,导致模块代码之间的“藕合度”高,程序之间的关系复杂。

2)软件的可维护性差,由于程序代码之间的关系复杂,这不仅导致对程序代码的可重用性差(无法再次被利用),而且也比较难维护和功能扩展。

(4)哪为什么面向对象程序设计方法又能够满足软件应用开发的要求

1)在程序设计方面,OOP它能让人们(程序开发人员)以更加接近于现实世界的“问题分析”方式理解软件应用系统的需求和描述需求。

2)OOP提供有“抽象”、“封装”、“继承”和“多态”等机制,这些机制在程序实现方面,能够将程序更好地封装隔离、模块化、可重用,并能够形成独立的功能组件。最终使得程序代码更加清晰、可理解。

应用面向对象程序设计方法进行软件应用系统的开发,可以达到程序设计中的如下三个主要目标:可重用性、可扩展性和可管理性。

(5)面向对象编程中的相关术语

读者要真正地理解和领会面向对象程序设计方法的基本思想,并在具体的软件应用开发中灵活和合理、正确地应用,需要多多进行编程实践,从实际的应用开发中去学习、总结、运用,才能真正地领悟出面向对象中的“道”。作者在此给希望从事软件开发的各种类型的读者提供一条经验:学习、编程、总结、再学习、再编程、再总结…循环反复多个轮回。此外,再好好地理解如下的几个基本术语。

1)对象、对象实例

2)类、基类(父类)、派生类(子类)

3)抽象

4)封装

5)继承与派生

6)多态(静态多态、动态多态)

2、如何应用面向对象的基本思想进行Java程序设计?

(1)编程要点

从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在软件系统构造的过程中尽可能运用人类的“自然思维”方式来编程实现该软件应用系统。

(2)代码及实现示例

作者以“学生”为问题示例,解释如何应用面向对象程序设计方法进行Java程序开发实现。

首先,对“问题”(也就是学生)进行抽象分析,提取出学生这一类群体所具有的共性。当然,面向对象所涉及的共性主要是指“属性”和“方法”。

学生这一类群体的人所具有的特征属性主要有:学号(ID)、姓名(name)、年龄(age)、所在学院(系,department)、年级(level)等等。当然,学生还有许多其它的特征属性,这就要根据待解决的问题应用要求合理地提取,而不应该包罗万象。

提取出的这些特征属性,在程序中怎么表现?继续以各种编程语言中的数据类型定义的变量形式出现在程序中,最后获得如下的属性定义:int ID、String name、int age、String department、int level。

学生这一类群体的人所具有的共性的行为主要有:课程学习、锻炼身体…。同样,学生也还有许多其它的共性行为,这也要根据待解决的问题应用要求合理地提取,而不应该面面俱到。

提取出的这些共性的行为,在程序中怎么表现?继续以各种编程语言中的函数定义的形式出现在程序中,函数的英文为function,一个函数其实就是一个功能,多个函数之间的调用构成了复杂的功能。最后获得如下的方法定义:void studyCourse(String courseContent)、void trainSelf(String item)。

当然,在面向对象程序设计方法的各种语言中,为了与以前的编程语言的函数相区别,不再称为函数而改称为方法。

其次,将抽象提取出的属性和行为,再进行封装组合在一起,形成一个新的“事物”。它在面向对象设计方法中称为“类”。各种面向对象的语言中都提供有类定义的语法规则,其实类定义就是面向对象设计方法中的“封装性”这一特性在某种语言中的具体实现。

在Java程序设计中,应用“class 类名称{}”的语法结构实现类定义,最终本问题(学生)相关的类定义参看如下示例图所示的程序代码。

当然,在上面的Student类定义体中,还有许多“元素”(符号)是面向对象设计方法中没有提及的,而是某种编程语言中基于各自设计目标而自己规定的。如public、private、package 、static等定义符,这些定义符是Java语言中所提出的相关符号。

3、请简要说明面向对象具有哪些基本的特征

3.1、面向对象中的“抽象”

(1)什么是抽象(Abstraction)

通过前面对学生类Student的实际编程,相信部分读者面向对象中的“抽象”应该有所理解。所谓的抽象就是对具体问题(对象)进行概括,抽出这一类对象的公共特性并加以描述的过程。

其实抽象就是忽略一个主题中与当前目标无关的那些方面及要素,以便能够更加充分地关注与当前目标有关的方面。抽象也就是暂时不打算了解问题的全部,而只是选择其中的一部分进行关注。因此,可以这么理解“抽象”——找出问题本质的过程。

(2)抽象包括两个方面

1)一是过程抽象——描述某类对象的共有的行为特征或具有的功能,形成对外的功能服务;

2)二是数据抽象——描述某类对象的属性或状态,它们是各个对象相互区别的物理量。这些属性量可以由外界触发改变,也可以是由对象自己的行为触发后其相应的状态发生变化。

(3)为什么要对问题进行抽象

软件开发人员是解决自然界中的“问题”,这些问题可能会是各种各样的形态出现在自然界中,如何将各种各样形态的问题能够统一?如何适应计算机处理?基于这些应用要求,面向对象设计方法中提出了“抽象”(提取和转换)。

因此,抽象是把问题领域的问题变成计算机解决领域内的解决方法,用计算机的思想来解释和描述问题,以适应和满足计算机处理的应用要求。

(4)如何实现抽象

1)找出本质的内容——对问题进行分析,提取其属性和行为。有选择性的忽略和决定什么是重要的,什么不是;聚焦并依赖于那些重要的,同时忽略那些不重要的;

2)对问题进行分层和分块——将一个复杂的问题或者系统划分成更容易管理的块。

上面示例图所示的DoctorStudent类是依据问题的层次性,在学生问题的基础上产生出博士生的问题。在DoctorStudent类既继承Student类中的相关属性和方法,也根据自身问题的应用需要,新增新的属性doctorType,代表理学博士、文学博士、法学博士、工学博士等类型;同时也重写Student类中studyCourse方法,因为博士生的课程学习与普通的本科生的课程学习在课程内容、课程深度和知识广度、理论方面、实践应用等方面是有不同的教学要求,也就意味着Student类中studyCourse方法不再满足博士生的应用要求,需要重新定义出——多态的特性。

Student类中trainSelf方法代表学生需要自我锻炼身体,这个行为同样也适用于博士生,直接继承而得以重用。因此。应用面向对象程序设计方法中的抽象、封装、继承、多态等机制能够很方便地进行程序设计。

(5)对客观世界中的实体进行抽象的示例

1)自行车

数据(属性或者状态):车架尺寸、车轮尺寸、牌子、材料名称…

操作(方法或者功能):变速、移动、修理…

2)Windows窗口

数据(属性或者状态):颜色、样式、标题、位置…

操作(方法或者功能):打开窗口、改变大小、移动位置…

3.2、面向对象中的“继承”

(1)与继承相关的基本术语

1)继承——是指在已有类的基础上快速构造出新类的过程;

2)派生——是指在构造新类的同时并新增新的特性的过程;

3)基(父)类——被继承特性的类;

4)派生(子)类——在基类的基础上新创建出的类。

(2)应用继承的目的

1)对现有系统或原有系统的功能实现程序加以重用;

2)扩充和完善现有系统——添加子类实现功能扩展,尽管面向对象的封装定义了代码块的边界并能够对代码进行保护,但如何扩展该代码块而又不破坏这些封装的边界呢?在Java语言中,这个机制是由继承提供的。

(3)继承的方式

1)单一继承:一个类只从某一个类来继承;

2)多重继承:一个类同时从两个以上的类来继承,在Java中不支持多重继承。

3.3、面向对象中的“封装”

(1)什么是封装

提供将所抽象出的问题的属性(数据成员)和行为(代码成员)相组合的一种机制,它能将这二类成员再组合在一起,形成对象或实体。

(2)为什么要进行封装

1)增强使用的安全性——使用者不必了解具体的实现细节,而只需要通过设计者提供的外部接口来操作它。

2)实现代码的包装器——封装可被理解为一种用作保护的包装器,以防止代码和数据被包装器外部所定义的其他代码任意访问。

(3)封装后的主要优点

1)实现高度模块化,从而产生出软件构件(控件或者组件),利用组件快速地组装程序;

2)客户程序可以调用一个并不了解内部机制的对象的方法,任何关于内部的改动对客户来说都是隐藏的;

(4)在Java程序中最基本的封装单元是类

在Java程序中最基本的封装单元是类,类定义了一组对象所共享的行为(数据和代码)。在某个类的基础上,可以继续派生出相关的子类,而且子类可以是多级的。

若干个类、接口等可以进一步进行封装,再次组合为更大的程序单元——程序包;而若干个程序包又可以再进一步进行封装,再次组合为更大更大的程序单元——系统库(API,Application Programming Interface,应用程序接口)。

(5)封装的基本要求

1)有一个特定的边界——所有的内部变化都限制在此边界内(如类定义的{});

2)有外部接口——此对象利用它与其它对象发生关联(如public成员);

3)有特定的访问权限——在对象外部不能访问或修改受保护的内部实现细节(如private成员),从而可以实现OOP中的数据封装。

(6)在Java编程中如何遵守封装的原则

要求使对象以外的部分不能随意存取对象的内部数据(属性),如果需要访问,则必须要通过对应的方法进行操作访问,从而有效地避免了外部错误对它的“交叉感染”,使软件错误能够局部化,最终达到减少程序查错和排错的难度和复杂度。

Student zhang=new Student();

zhang.name=”张三”

zhang.setName(“张三”);

当然,一旦对某个问题进行封装后,如何能够方便地操作访问?访问控制权限的概念在Java语言中加以应用。因此,在类定义体中可以有public、protected和private等类型的成员。

(7)在Java程序设计中是如何实现面向对象的封装

通过定义出某类问题所在的类型,并对该类型的问题抽象和采用特定的编程语言描述其成员。如下为Java程序类定义的示例代码——定义一个Java程序类,其实就是对某个问题进行封装。

public class SomeOneClass{

//描述该类所对应的问题的各个属性(特征)

//体现该类所应该实现的行为或者服务(对外而言)

}

3.4、面向对象中的“多态”

(1)什么是多态性

“同名”但“不同的功能实现形式”——也就是在父类中定义的方法被子类覆盖后,可以给出不同的行为实现。

(2)应用多态编程时所产生出的效果

1)分割了“接口”和“实现”——即把“做什么”和“如何做”两个概念分离开来(从而将“设计”和“实现”分离);

2)使得同一个“功能服务”在父类及其各个子类中具有不同的语义并能够产生出不同的最终实现;

(3)如何正确地应用多态进行编程

在基类中提供一种方法的定义或者初步实现,但要求在子类中对该方法加以重写并给出自己的实现;并要求保持功能的实现形式(对外的接口一致)相同。

(4)在Java中实现多态的两种方法

1)采用接口

在实现类中实现所对应的接口中的成员方法,并且不同的实现类可以产生出不同的结果,参看如下示例图所示的程序代码示例。

2)采用继承

在子类中可以覆盖上层基类的成员方法,不同的子类可以产生出不同的结果,参看如下示例图所示的程序代码示例。

(5)为什么要应用多态进行编程

1)为了能够处理不同层次的问题——当处理的问题在类型方面有层次结构时,开发者常常不希望把对象看作是某一特殊类型的对象,而把它看作是基类的类型对象(某种“通用的类型”对象或者是某种“泛泛的类型”);

2)提供通用的功能实现代码——应用多态可以使得开发者能够编写出不依赖于特殊类的类型的代码,也就是尽可能使得程序具有更好的通用性。

《Java语言程序设计》期末考试模拟试题——填空题和编程题

《Java语言程序设计》期末考试模拟试题——判断题和问答题

计算机等级二级考试辅导:“面向对象”单元题解答(第3部分)

计算机等级二级考试辅导:“面向对象”单元题解答(第2部分)

计算机等级二级考试辅导:“面向对象”单元题解答(第1部分)

想了解更多精彩内容,快来关注杨教授工作室

在线客服
联系方式

热线电话

13503294431

上班时间

周一到周五

公司电话

二维码
线