第03章面向对象的核心特性

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第三章类的封装、继承和多态这一章介绍面向对象编程的核心特性,是全书最重要的一章。计算机软件设计有两个重要方面:一是算法,用来解决微观的、有难度的问题。教材第二章涉及的JAVA语法,主要是用来描述算法的。以前学过的C语言和数据结构,也是着重于算法的。算法研究的是什么呢?二是软件体系结构,用来解决宏观的、有复杂度的问题。教材第三章JAVA语法,主要是用来描述软件体系结构的。软件体系结构研究的是什么呢?面向对象(Object—Oriented,简称OO)的思想、概念和编程方法,或许是我们本科阶段,所能学到的最高级的编程技术,这种技术对编程算法起不到很大作用,面向对象涉及的是比算法宏观一些的软件体系结构问题,面向对象的优势在编写大型软件时才能体现出来,由于本科阶段我们得几乎得不到编写大型软件的机会,所以对面向对象很难有一个深入的认识。对面向对象的思想、概念和目的的深入认识是非常重要的。首先它对学好JAVA、.NET、C++等面向对象的编程有重要影响;其次以后的实际工作中我们面对的都是大型的、复杂的软件系统(而不仅仅是微观的算法),用面向对象的方法去设计这些系统是最合适的。我们需要在不同的课程中(C++、JAVA、.NET)反复说明面向对象的思想、概念和目的。在JAVA这门课里,我将从几个层面分别说明:(1)在教材本章,我将从分析人的自然思维习惯入手,说明面向对象编程(Object—OrientedProgramming,简称OOP)的几个核心概念:对象、类、属性、方法、封装、重载、实例、继承、多态。我的目地是使同学们相信:OO是符合人的自然思维习惯的一种编程方法,是高级语言出现以后,符合人的自然思维习惯的编程方法的一次飞跃。对于面向对象的概念和思想,我们不必像课本描述的那样抽象的理解它,而是用自然轻松的心态理解它。我们将从建立单个对象、研究单个对象内部结构入手,过渡到研究对个对象间的相互作用。(2)在本章及后续章节,我将从对JAVA类库---JDK中一部分常用类的讲解入手,反复说明面向对象给我们带来的三个好处:提高程序的复用性降低系统的复杂性以不变的对象结构应对变化的对象。这三个好处是软件工程永恒的追求。3.0面向对象是适合人的自然思维习惯的编程方法(补充教材)3.0.1范式及编程语言世界上有很多的编程语言,可以按照不同的标准对其分类,第二章在讲到JAVA数据类型时,曾将编程语言按类型分为强类型的和弱类型的。下面对编程语言作另一种分类:按范式分类。范式的英文单词是paradigm。它的原意大致是典范、范例、示例的意思,为了帮助我们理解某些英文动词的用法,老师会给一些例句(paradigm、example),在所有的计算机编程书籍中,都有大量的例程(范例)。有些计算机书籍中,将paradigm称为“范例”——指一种示范性的模型或例子,它提供了一种组织信息的形式。范式的概念是1962年,美国科学史学家和科学哲学家托马斯·库恩(ThomasS.Kuhn)出版了著名的《TheStructureofScientificRevolutions》一书提出的,其核心——范式论在自然科学家中引起强烈的共鸣,并波及社会科学的广泛领域。在计算机领域我们也常使用范式的概念,比如著名的关系数据库的第一、二、三范式。范式包括三个方面:(1)范式建立在科学理论体系内。(2)范式运用该理论体系的心理认知因素。(3)范式指导和联系上述两者(理论体系和心理认知)的自然观。范式观念对于学习和使用OOP十分重要。在学习OOP时,许多人自然而然偏重于技术层面,能够把OO语法搞得清清楚楚,但忽视自然观和心理认知因素。这常常使他们在采用OO思想的过程中,产生无用感、被迫感、挫折感、逃避愿望。现有的编程语言,按照范式可分为以下四类:(1)命令的或过程式,如C语言,Pascal语言。(2)声明的或基于逻辑的,如Prolog语言。(3)函数的,如LISP、ML语言。(4)面向对象的,如Java、C#,C++等与语言门派相对应的就是所谓的四大编程范式(Programmingparadigm)或曰四大计算模型。其中第2类----声明的范式(declarativeparadigm)多被用于知识表达和推理的应用中,似乎暂时离我们远了点因次本课不讨论它。(1)命令范式命令的语言或过程式语言(imperativeorprocedurallanguages)是最为传统的编程语言。从机器语言、汇编语言到早期的某些高级语言(如BASIC、Fortran、Cobol及C等),都属于该范式。过程式语言是命令驱动(command-driven)或者说是面向语句的(statement-oriented)语言。其基本概念是机器状态(machinestate)——计算机中所有内存区域的所有值的集合。一个程序由一系列的语句组成,而每一个语句的执行导致计算机的内存的一个或多个区域的值发生变化,也就是说,机器进入了一个新的状态。过程式语言的语法(syntax)一般有这样的形式:statement1;statement2;……内存是一些小盒子的集合,一个语句的执行(例如两个变量相加得到第3个变量)就是访问内存区域(两个小盒子),通过某种方式合并区域的值并将结果保存到某一个区域(小盒子)中。这是编程者非常容易接受的第一印象,这一计算模型追随的是这种事实:计算机硬件按顺序执行指令(instruction)。计算机就是这样运作的,我们的编程语言也应该追随,因此,大量的传统编程语言遵循这样计算模型,广泛使用的语言,如C、Fortran、Cobol、Pascal等都支持这一计算模型。从编程方式和思想上,传统的命令范式把编程过程定义为一个命令序列的开发,这些命令操作数据而产生所期望的结果。事实上它是以CPU的“取得-解码-执行”循环为基础。其核心是“解决一个问题所需要的算法是什么?”或者说“什么是其算法,为了解决一个问题”。其代表性口号是“程序=算法+数据结构”。其基本的程序结构是:顺序、分枝、循环,这三种结构加上一些必要的数据类型,能解决任何算法问题。命令范式语言有很多是高级语言,但这些高级语言是带有浓厚的机器思维色彩。但无论如何命令范式是几乎所有编程语言的基础,现在面向对象范式的语言,如JAVA也保留了命令范式的语法,这些语法几乎都在教材第2章。(2)函数范式函数式语言(functionalorapplicativelanguages)是不同于过程式语言的一种计算,它不注重于机器状态的变化,而是关注程序表现出来的功能。也就是说,为了访问变量的初始化数据并以某种方式合并它们从而得到结果,我们必须找到一些函数(function)应用在机器初始状态上。其语法一般有这样的形式:functionn(……function2(function1(data))……)函数式语言的典型代表是LISP,函数范式(functionalparadigm)将编程活动视为构造“黑匣子”,黑匣子的工作方式是:参数输入代码块结果输出。即参数被传入某个处理过程,最后返回计算结果,这就是其称为函数范式的原因,黑匣子如同数学上的函数:Y=F(x1,x2,x3…),x是函数的自变量(也可叫参数),F是函数名字,Y是函数的运算结果。函数式语言把编程过程视为一些函数的开发,所构造的函数是预先开发的简单函数的嵌套联合体,所有的函数作用于初始数据和中间数据直到最后一个函数能够计算出结果。显然,函数范式是天然的模块方式(modularapproach)。函数范式语言提供了编程模块的封装(函数级别的“黑匣子”)和复用(函数可以重复调用),这是非常重要的程序设计思想,因此,命令范式和面向对象范式的语言也继承了这种思想。在C/C++语言里,我们有函数和类的成员函数;在JAVA、C#等纯面向对象语言里,函数改了个称呼:叫“方法”,方法也不是独立的,而是类的一部分。(3)面向对象范式面向对象范式是命令的范式和函数范式的自然产物,是它们的继承与发展。面向对象范式超越了算法的界限,应该视为软件的整体设计思想,这种思想不再是机器思维的模仿,而是达到了与人的自然思维方式的基本一致。这种思想是建立在对象、类、属性、方法、封装、重载、实例、继承、多态等概念之上的。下面逐一介绍这些概念及其与JAVA语言对应的语法表示。计算机语言的发展趋势是:越来越接近人的自然思维习惯。面向对象编程,是再目前成熟的编程方法中,最接近人的自然思惯的编程方法,的其代表性口号是“程序=(对象的)复用+扩展”。3.0.2对象和类(1)对象、属性、方法、类面向对象思想起源于何时?应该说从人类具有抽象思维能力的那一天就有了,人的“自然的、本能的”思维方式就是面向对象的。系统的总结面向对象的思想并非起源于软件工程界,而是与哲学有很大渊源。首先要提一下的是维特根斯坦(1889-1951),他是上世纪乃至人类哲学史上最伟大的哲学家之一。他于1922年出版了一本著作——《逻辑哲学论》(TractatusLogico-Philosophicus)在该书中,他阐述了一种面向对象的世界观,或者说一种面向对象认识世界的观点,这种世界观对面向对象的软件方法学有很大影响。其次,培根(FrancisBacon,1561—1626)他提出了科学认识的方法──归纳法,OO分类体现了这种方法。还有达尔文的进化论,与OO的继承思想如出一辙。总之,在上世纪在六七十年代后,软件工程界受到他们的启示,使面向对象终于由一种哲学思想沉淀到软件技术的层面上来,成为计算机业界的宠儿,这就是面向对象(OO,Object-Oriented,港台用语叫物件导向)的由来。什么是对象?对象是指客观世界一切可被呈现的或被感知的事物。首先对象是物理实体,比如我们日常生活中常说“某某党员发展对象,恋爱对象,帮助对象,扶贫对象”都是指物理实体;其次对象还可以是任一类概念实体,例如教师对学生成绩进行研究分析,学生成绩是个概念实体。总之,世间万物,只要被你观察上了研究上了,皆对象。当我们用“自然的,本能的”思维方式对一个对象观察研究的时侯,会发现对象包含两方面的特征:一方面是事物的静态特性:如尺寸,形状等,静态特性一般描述这个事物“是什么”,一般是名词性的,我们这一类的特征叫对象的属性(attribute);另一方面是事物的动态特性(行为特性):动态特性一般描述这个事物“干什么(操作)”,一般是动词性的,我们这一类的特征叫对象的方法(method)。比如说我们把大学生张三作为一个对象观察,那么他的相貌、身高、体重、年令等是对象张三的属性,他吃饭、睡觉、走路、学习、写字则是对象张三的方法。[提示:在C++里,属性叫成员变量,方法叫成员函数。]下面我们对大学生张三建立一个“对象模型”,用伪代码描述:Object张三//对象的名字是张三{name=“张三”;age=21;school=“山大威海分校”;。。。。。。。。。。//上面是对象张三的静态描述,是张三的属性Study(“JAVA编程”)Play(“篮球”)。。。。。。。。。。//上面是对象张三的动态描述,是张三的方法}这个模型,只是对大学生张三这个具体的对象的描述,稍加观察我们会发现,张三所具有的属性和方法在大学生里具有普遍意义,或者说,张三是大学生这一类对象的一个个体对象。将上面的“对象模型”抽象一下,改造为具有普遍意义的“一类对象”:class大学生//用class代表一类对象{Stringname;//不指定name的具体值,而是将name抽象为Stringintage;//不指定age的具体值,而是将age抽象为intStringschool;。。。。。。。。。。//上面是大学生类别的静态描述,是大学生类的属性Study(String课程名)//不指定具体课程名,而是将课程名抽象为StringPlay(String运动项目)。。。。。。。。。。//上面是对大学生类别的动态描述,是大学生类的方法}这个类的模型是抽象的,因此有普遍意义,对所有大学生都适合。当我们需要“对象张三”时,只需对上述模型的属性赋值,对方法

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功