
1、请简述面向对象编程方法的基本思想
(1)面向对象和面向对象编程)
面向对象(Object Oriented,OO)是一种编程思想,而面向对象编程(Object Oriented Programming,OOP)是一种编程技术。OOP主要使用对象、类、继承、封装、消息、多态等基本概念来设计程序。OOP是基于OO的认知和世界观的思想。
因为从面向对象的角度来看,世界上的一切都是“对象”,正如哲学家告诉我们的:世界是由“相关”的“物质”组成的;而面向对象领域的专家告诉我们:世界是由“对象”组成的,它们是由一组相互关联、可以相互通信的实体(Object,objects)组成的。
正是因为世间万物都有一定的“关系”,当然面向对象所涉及的对象之间也存在一定的关系(联系),而这些关系就是自然界中对应的对象。“事物”之间的自然关系。
在面向对象领域,这些关系概括为以下形式:“关联、依赖、组合和继承”。下面示例图中所示的UML类图代表了“计算机”和“PC计算机”、“CPU”、“硬盘”、“打印机”、“计算机用户”和计算机处理的“数据”的不同形式。关系。
虽然 UML 类图对普通人来说有点“深奥”,但普通人应该能够理解和熟悉这些“事物”(即面向对象中的对象)之间的自然关系。读过这篇文章的读者不会对这些关系感到陌生,但问题是这些关系是否可以直接体现在某种语言的程序代码中,或者说程序员在编程的时候是否可以编写一个程序来解决一个问题。根据要解决的问题的“自然特征”和自然“相互关系”构建相应的程序代码,而不是像以前那样按照计算机处理流程和适应机器存储格式的要求进行编程。
一旦这样的“自然方式”可以用于编程,首先程序员可以在编程思维中继续使用人类的自然思维,不再迎合机器的数据处理需求(相信有汇编语言编程经验的读者应该深有体会!)。思维一旦回归,解决问题就会“得心应手”;其次,编程简单,程序结构和关系易于理解。
基于这种应用的需求,IT领域出现了面向对象的概念、思想等(当然这些都发生在上个世纪),然后出现了一种基于面向对象思维的编程方法——object-面向编程。.
(2)基于面向对象编程方法的面向对象编程的基本思想
1)一切都是对象,一切都是对象
更准确的说法应该是“一切都是相应类型的对象”。人类对自然的认识和认识是建立在“分类”的概念之上的,通过“分类”更容易认识和理解一类事物的特征——将许多事物归纳和划分为一些“类型”是人类在理解客观世界(如人、计算机、教室、学生和教师等)时经常使用的思维方式。基于此,在面向对象领域中自然产生了术语“类”和“对象”。
读者对“人”和“我”这两个概念非常熟悉,“人”代表生活在地球上的各个地区、国家和民族的人;一个特定的“个体”(例外、实例、实例等)。通过“人”与“我”之间体现的“共性”与“个体”的关系,读者可以很容易地理解“类”与“对象(对象实例)”在面向对象领域之间的关系。
2)万物皆可归类,万物皆有共性与个性
为此,在面向对象领域,提出了以下技术实现方法:抽象(提取)相关事物(对象)的共同部分(特征、数据量、属性)和(行为、功能、方法),以及然后将它们打包组合成一个类。
面向对象领域中的“类”实际上是反映一组具有相同属性和方法的实体(对象)的集合,它为属于该类的所有实体(每个具体问题)提供了“统一抽象” . 描述”。出于这个原因,术语“抽象”和“封装”再次出现。
在应用程序开发过程中,面向对象的程序员根据对要解决的问题的“理解”和问题之间的自然“关系”,对要解决的问题进行“抽象”分析,提取出与问题相关的“特征”。这类问题。”和“行为”,然后在生活中应用“打包(packaging)”的手段,将“特征”和“行为”重新组合,生成一个类(类型)。
上述概念如何在计算机中表示并适应计算机的处理流程?为此,产生了各种基于面向对象设计思想的编程语言——面向对象的编程语言,如C++、Java、C#等,借助这些语言来描述上述——提到了各种概念。在Java语言中,抽象出来的“特征”用各种“变量”来表示,形成“属性”;抽象出来的“行为”用各种形式的函数(函数、函数等)来表示,形成一个“方法”。
最后将“属性”和“方法”以类定义的形式组合在一起,形成一个封装体,类的定义体也随之生成。因此,各种面向对象语言中的类定义其实就是“封装”的具体技术实现。类定义中的“{}”实际上反映了封装的“边界”。
3)万物皆有层次,万物之间的关系不仅体现在横向,也体现在纵向
“你”、“我”、“他”或“她”更多地体现了人与人之间的横向关系(同一层次的各种关系),而“爷爷”、“爸爸”、“儿子”则体现了人与人之间的纵向关系. 如何解决或描述面向对象领域问题的“层次”关系?出于这个原因,创造了“继承”和“派生”这两个词。
面向对象领域中的“类”并不是孤立的。在某个类的基础上,可以根据问题之间的自然层次关系生成对应的派生类(子类)。也就是说,不同层次的类不仅通过继承(extends)反映这些类对应的问题之间的层次关系,而且共享从上层类体抽象出来的共同内容(继承)。
通过根据问题不断总结共同部分和层级关系,可以形成不同层次的类(一个父类实际上是另一个父类的子类)。面向对象领域的“继承”和“派生”不仅解决了自然界中分层事物如何描述的问题,还可以达到编程中“重用(reuse)”的效果。这包括“设计思维”、“编程方法”、“系统架构”和“程序代码”的重用(reuse)。
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(ID)、姓名(name)、年龄(age)、学院(department、department)、年级(level)等。当然,学生还有很多其他的特征属性,应该根据要解决的问题的应用需求合理提取,不能包罗万象。
这些提取出来的特征属性在程序中是如何出现的?继续以各种编程语言中数据类型定义的变量的形式出现在程序中,最终得到以下属性定义:int ID、String name、int age、String部门、int level。
这群人中学生的共同行为是:课程学习、体育锻炼…… 同样,学生也有很多其他的共同行为,应该根据所要解决的问题的应用需求合理提取,不应该面面俱到。
这些常见的行为是如何在程序中提取出来的?继续以各种编程语言中的函数定义的形式出现在程序中。函数的英文是function,一个函数其实就是一个函数,多个函数之间的调用构成了一个复杂的函数。最后得到如下方法定义:void studyCourse(String courseContent)、void trainSelf(String item)。
当然,在面向对象编程方法的各种语言中,为了与以前的编程语言的功能区分开来,不再叫函数而是改名为方法。
其次,从抽象中提取出来的属性和行为被封装起来,组合在一起,形成一个新的“事物”。它在面向对象的设计方法中被称为“类”。各种面向对象的语言都提供了类定义的语法规则。实际上,类定义是面向对象设计方法中“封装”特性在某种语言中的具体实现。
在Java编程中,使用“类类名{}”的语法结构来实现类定义。关于本题(学生)的最终类定义,请参考下图示例程序代码。
当然,在上面的Student类定义中,有很多“元素”(符号)在面向对象的设计方法中没有提到,而是由某种编程语言根据自己的设计目标来规定的。比如public、private、package、static等定义器,这些定义器是Java语言中提出的相关符号。
3、请简述面向对象的基本特征
3.1、面向对象的“抽象”
(1)什么是抽象?
通过Student类Student的实际编程,相信有些读者应该明白了面向对象中的“抽象”。所谓抽象,就是对具体问题(对象)进行概括,提取这些对象的共同特征并加以描述的过程。
实际上,抽象就是忽略一个主题中与当前目标无关的那些方面和元素,以便能够更充分地关注与当前目标相关的方面。抽象意味着暂时不打算了解问题的全部,而只是选择其中的一部分来关注。因此,“抽象”可以理解为找出问题本质的过程。
(2)抽象包括两个方面
1)首先是过程抽象——描述某类对象的共同行为特征或功能,形成外部功能服务;
2)二是数据抽象——描述某类对象的属性或状态,是区分每个对象的物理量。这些属性量可以由外界触发改变,也可以由对象自身的行为触发相应的状态。
(3)为什么要抽象问题
软件开发人员正在解决自然界的“问题”。这些问题在自然界中可能以各种形式出现。各种形式的问题如何统一起来?如何适应计算机处理?基于这些应用需求,在面向对象的设计方法中提出了“抽象”(extraction and transformation)。
因此,抽象就是将问题域中的问题转化为计算机解域中的解,用计算机的思想来解释和描述问题,以适应和满足计算机处理的应用需求。
(4)如何实现抽象
1)找到本质——分析问题,提取其属性和行为。选择性地忽略并决定什么是重要的,什么是不重要的;关注和依赖重要的东西,而忽略不重要的东西;
2)分层和分块问题 – 将复杂问题或系统划分为更易于管理的块。
上例图所示的DoctorStudent类是基于问题的层次结构,根据学生的问题生成博士生的问题。DoctorStudent类不仅继承了Student类中的相关属性和方法,还根据自身问题的应用需求,新增了属性doctorType,分别代表Doctor of Science、Doctor of Letters、Doctor of Law、Doctor同时还改写了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,Application Programming Interface)。
(5)封装基本要求
1) 有一个特定的边界 – 所有内部更改都被限制在这个边界内(如类定义中的 { } );
2) 有一个外部接口——这个对象使用它来与其他对象(例如公共成员)关联;
3)拥有特定的访问权限——受保护的内部实现细节(如私有成员)不能在对象外部访问或修改,从而实现OOP中的数据封装。
(6)Java编程中如何遵循封装原则
要求对象以外的部分不能自由访问对象的内部数据(属性)。如果需要访问,则必须通过相应的方法访问,从而有效避免外部错误对它的“交叉感染”,使软件错误可以被本地化,最终降低程序排错和调试的难度和复杂性。
张学生=新学生();
zhang.name=”张三”
zhang.setName(“张三”);
当然面对对象程序设计期末,一旦封装了一个问题,怎么能方便的访问呢?Java 语言中应用了访问控制权限的概念。因此,类定义体中可以存在public、protected和private等类型的成员。
(7)Java编程中如何实现面向对象的封装
通过定义某类问题的类型,将问题的类型抽象出来,用特定的编程语言来描述其成员。下面是为Java程序类定义的示例代码——定义一个Java程序类其实就是在封装某个问题。
公共类 SomeOneClass{
//描述这个类对应的问题的属性(特征)
//反映类应该实现的行为或服务(对外)
}
3.4、面向对象中的“多态性”
(1)什么是多态性
“同名”但“功能实现形式不同”——即父类中定义的方法被子类覆盖后,可以给出不同的行为实现。
(2)应用多态编程的效果
1) 将“接口”和“实现”分开——即分离“什么”和“如何”的概念(以及“设计”和“实现”);
2) 使同一个“功能服务”在父类及其子类中具有不同的语义,可以产生不同的最终实现;
(3)如何在编程中正确应用多态性
在基类中提供方法的定义或初始实现,但要求在子类中重写该方法并给出自己的实现;并且要求函数的实现形式(一致的外部接口)相同。
(4)Java实现多态的两种方式
1)采用接口
对应接口中的成员方法在实现类中实现,不同的实现类可以产生不同的结果。请参见下图示例中显示的程序代码示例。
2)使用继承
在子类中,可以重写上层基类的成员方法,不同的子类可以产生不同的结果。请参考下图示例中的程序代码示例。
(5)为什么要使用多态进行编程?
1)为了能够处理不同层次的问题——在处理类型方面有层次的问题时,开发者往往不想把一个对象想成一个特定类型的对象,但作为基础类的类型对象(某种“通用类型”对象或某种“通用类型”);
2)提供通用的功能实现代码——应用多态性允许开发者编写不依赖于特殊类的类型的代码,也就是使程序尽可能通用。
《Java语言编程》期末考试模拟试题——填空题和编程题
《Java语言编程》期末考试模拟试题-真假题和问答题
计算机 2 级考试准备:“面向对象”单元问题解答(第 3 部分)
计算机 2 级考试准备:“面向对象”单元问题解决方案(第 2 部分)
计算机 2 级考试准备:“面向对象”单元问题解答(第 1 部分)
请登录后发表评论
注册
社交帐号登录