Java程序设计与计算思维(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-13 08:34:56

点击下载

作者:赵军 等

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Java程序设计与计算思维

Java程序设计与计算思维试读:

前言

Java的版本在不断更新,Oracle公司于2017年9月21日发布了Java SE 9(Java Standard Edition 9,Java标准第9版),接着在2018年3月21日,又发布了Java SE 10。目前,最新产品的名称为Java SE Development Kit 11(Java标准版开发工具包第11版,简称Java SE 11),是在2018年9月25日发布的。

Java的开发工具包分成IDE(Integrated Development Environment,集成开发环境)和JDK(Java Development Kit,Java开发工具包)两种,本书选用的Java编译环境为最新的软件开发工具包JDK 11。即便没有集成开发环境,使用“记事本”这种简单的编辑器也可以轻松编辑Java程序。

Java语言从诞生之后就魅力不减,软件从业者和硬件制造者竞相采用Java语言编写主要的控制程序或应用程序,许多大专院校纷纷开设Java的基础课程及应用专题。市面上关于Java程序设计的图书琳琅满目,引进翻译的Java图书大部分只注重Java编程理论的讲解,在范例程序的解析上稍显不足。对初学者而言,这类书缺乏上机编程的实践指导,初学者很少有实际演练的机会。国内编著的Java书则在实践方面着墨甚多,以实践来引导概念的理解,注重范例程序的质与量。

笔者希望结合国内外程序设计语言系列书的优点,遵循程序设计的步骤,配合适当的范例程序,以减少读者在学习Java程序设计时的障碍。此外,对所有范例程序都提供了完整的代码、执行结果截图和关键程序语句含义的说明。在本书中,我们将教导读者如何编写出一个正确的Java程序,同时使得程序具有良好的结构与可读性。书中的重要概念都配有“示意图”进行解析,大部分章节还安排了“本章高级应用练习实例”,为读者提供更丰富的应用实例,从而有更多活用程序语法的实践演练机会。

本书适合综合性大学、理工科大学、技术专科学院作为教材,用于教授程序设计、面向对象程序设计等相关课程;同时,也适合想学习Java程序设计的读者作为自学参考书。初学者可以借助本书进入Java程序设计语言的殿堂。

本书的目标是让读者了解如何编写Java程序,以及更深入地理解什么是面向对象的程序设计,学会以Java的视角来思考面向对象的程序设计,并最终将面向对象的程序设计付诸实践。Java程序的强大功能是全世界有目共睹的,它真正引导的是面向对象程序设计的思维,而让读者完全掌握这种思维,正是本书努力实现的目标。

本书中的所有范例程序都是在JDK 11环境中编写和编译通过的,并确认执行结果正确无误。课后习题中有关编程实践的习题,我们编写了参考程序供读者参考。

读者可以登录机械工业出版社华章公司的网站(www.hzbook.com)下载本书范例程序和课后习题的参考程序,先搜索到本书,然后在页面上的“资料下载”模块下载即可。如果下载有问题,请发送电子邮件至booksaga@126.com,邮件主题为“Java程序设计与计算思维”。

本书主要由赵军、吴灿铭编写,同时参与编写工作的还有王国春、施妍然、王然、孙学南等。

最后,祝读者学习愉快,顺利加入Java程序设计一族。资深架构师 赵军2019年4月第1章 计算思维与Java设计初步体验

计算机(Computer)堪称是20世纪以来人类最伟大的发明之一,对于人类的影响更甚于工业革命所带来的冲击。计算机是一种具备数据处理与计算功能的电子设备。在1946年,美国宾州大学教授埃克特与莫西利合作完成了人类第一台真空电子管计算机ENIAC。而在1945年,冯·诺依曼教授首先提出了计算机存储程序的运行方式与二进制的概念,认为数据与程序可以存储在计算机的存储器再投入运行,于是拉开了程序设计语言与程序设计蓬勃发展的序幕。自从人类发明计算机,计算机就渗透到人类生活的各个领域。如图1-1所示的是计算机运用于工厂生产线与大楼自动化安保管理的例子。图1-1

从程序设计语言的发展史来看,其种类还真是不少,如果包括实验、教学或科学研究中使用的程序设计语言,那么可能有上百种之多,不过每种程序设计语言都有其发展的背景及目的。例如FORTRAN语言是世界上第一个开发成功的高级程序设计语言,另一个早期非常流行的高级程序设计语言是BASIC语言,它不但易学易懂,而且非常适合初学者了解程序设计语言的运行过程,笔者算是最早一批“计算机普及要从娃娃抓起”的受益者,在上初中的时候第一次接触计算机,学习的程序设计语言就是BASIC,它的早期版本不是结构化的程序设计语言。早期的另一种语言PASCAL的主要目标是教导程序设计的原则,笔者进入大学计算机系学习的第一种程序设计语言就是PASCAL语言,它基本上是早期用于大学教授学生结构化程序设计思想的首选语言。后来陆续推出了商业用途的COBOL语言、人工智能专用的PROLOG语言等,有些语言出现之后一直流行至今,如C、C++、Java、Visual Basic语言,其中的Java语言是具有代表性的面向对象程序设计语言之一。

时至今日,面向对象程序设计的概念已经倡导多年。20世纪70年代出现的Smalltalk语言是真正的第一个面向对象的程序设计语言,后来C++和Java也加入了面向对象程序设计语言的阵营,Java语言是一种完全面向对象的程序设计语言。本章将从程序设计最重要的计算思维概念开始讲述,然后概略性地介绍程序设计语言的分类、程序设计的步骤及Java语言,涉及的内容包括Java的起源、语言的特性和应用范围。同时,也会谈到最新的开发工具Java SE 11的新增功能,示范如何正确地编译与执行Java程序。完成本章的学习后,我们可以开始编写第一个Java程序,就会清楚Java简易的程序结构。

本章的学习目标

·认识计算思维

·程序设计语言的分类

·程序设计的流程

·程序设计的原则

·结构化与面向对象的程序设计

·Java语言的起源

·Java语言的特性

·Java的开发工具

·JDK的安装与运行环境的设置

·Java程序的编译与执行

·Java的程序结构解析

·Java SE11新增功能的简介1.1 认识计算思维

对于一个有志于投身信息技术领域的人员来说,程序设计是一门和计算机硬件与软件息息相关的学科,是计算机诞生以来一直蓬勃发展的新兴科学。从长远的发展来看,程序设计能力已经被看成是国力的象征,不少省市已经将程序设计列入高中学生的选修课程,有些省份的高考甚至加入程序设计的考核,例如浙江省从2017年高考开始,除了语文、数学、英语三科必考外,其他七选三的选考科目中就有“技术”科目,考核的内容包括通用技术和信息技术。程序设计能力不再是计算机、通信、信息等相关理工科专业的学子必备的能力,而是新一代人才都必须具备的基本能力。程序设计的本质是数学,或者更直接地说是数学的应用。过去,程序设计非常看重计算能力。随着信息与网络科技的高速发展,计算能力不再是唯一的目标,在程序设计课程中着重加强学生计算思维(Computational Thinking,CT)的培养和训练。

在日常生活中,无论是大事还是小事,都是在解决问题,任何只要牵涉到“解决问题”的议题,都可以运用计算思维来解决。读书与学习就是为了培养我们在生活中解决问题的能力,计算思维是一种利用计算机的逻辑来解决问题的思维,就是一种能够将问题“抽象化”与“具体化”的能力,也是新一代人才都应该具备的素质。

我们可以这样说:“学习程序设计不等于学习计算思维,程序设计的过程就是一种计算思维的表现,而要学好计算思维,通过程序设计来学绝对是最佳的途径”。程序设计语言本身就只是工具,没有最好的程序设计语言,只有是否适合的程序设计语言。学习程序设计的目标绝对不是要把每位学习者都培养成为专业的程序设计人员,而是要帮助每个人建立系统化的逻辑思维模式。1.1.1 计算思维的内容

2006年,美国卡内基·梅隆大学的Jeannette M.Wing教授首次提出了“计算思维”的概念,她提出计算思维是现代人的一种基本技能,所有人都应该积极学习,随后谷歌(Google)公司也为教育者开发了一套计算思维课程(Computational Thinking for Educators),这套课程提出了培养计算思维的4部分,分别是分解(Decomposition)、模式识别(Pattern Recognition)、模式概括与抽象(Pattern Generalization and Abstraction)以及算法(Algorithm)。虽然这并不是建立计算思维唯一的方法,不过通过这4部分我们可以更有效地进行思维能力的训练,不断使用计算方法与工具解决问题,进而逐渐养成我们的计算思维习惯。虽然这并不是建立计算思维的唯一方法,不过通过这4部分我们能更有效率地拓展思维,提高使用计算方法与工具解决问题的能力,最终建立计算思维。也就是要将这4部分进行系统的学习与组合,并使用计算机来协助问题的解决(参考图1-2)。在后面的章节我们来详细说明。图1-21.1.2 分解

许多人在编写程序或解决问题时,对于问题的分解(Decomposition)不知道从何处着手,将问题想得太庞大,如果对一个问题不能进行有效分解,就会很难处理。将一个复杂的问题分割成许多小问题,把这些小问题各个击破,小问题全部解决之后,原本的大问题也就解决了。

下面我们以一个实际的例子来说明。如果有8幅非常难画的图,我们可以把它们分成2组各4幅图来完成,如果还是觉得太复杂,继续再分成4组,每组各两幅图来完成,采用相同模式反复分割问题(如图1-3所示),这就是最简单的分治法(Divide and Conquer)的核心思想。图1-3提示

分治法(也称为“分而治之法”)是一种很重要的算法,我们可以应用分治法来逐一分解复杂的问题,它的核心思想是将一个难以直接解决的大问题按照相同的概念分割成两个或更多的子问题,以便各个击破,即“分而治之”。其实任何一个可以用程序求解的问题所需的计算时间都与其规模有关,问题的规模越小,越容易直接求解。

例如我们有一台计算机的部件出现故障了,如果将整台计算机逐步分解成较小的部分,对每个部分的各个硬件部件进行检查,就容易找出有问题的部件。再例如一位警察在思考如何破案时,需要将复杂的问题细分成许多小问题。经常编写程序的人在遇到问题时会考虑所有的可能性,把问题逐步分解,久而久之,这种逻辑思维的习惯就成了这些人的思考模式了,如图1-4所示。图1-41.1.3 模式识别

在把一个复杂的问题分解之后,我们常常可以发现小问题中有共同的属性以及相似之处,在计算思维中,这些属性被称为“模式”(Pattern)。模式识别是指在一组数据中找出特征(Feature)或规则(Rule),用于对数据进行识别与分类,以作为决策判断的依据。在解决问题的过程中找到模式是非常重要的,模式可以让问题的解决更为简化。当问题具有相同的特征时,它们能够被更简单地解决,因为存在共同模式时,我们可以用相同的方法解决此类问题。

举例来说,在知道怎么描述一只狗之后,我们可以按照这种模式轻松地描述其他狗,例如狗都有眼睛、尾巴与4只脚,不一样的地方是每只狗或多或少地有其独特之处(如图1-5所示),识别出这种模式之后,便可用这种解决办法来应对不同的问题。因为我们知道所有的狗都有这类属性,当想要画狗的时候便可将这些共同的属性加入,这样就可以很快地画出很多只狗。图1-51.1.4 模式概括与抽象

模式概括与抽象在于过滤以及忽略不必要的特征,让我们可以集中在重要的特征上,这样有助于将问题抽象化,通常这个过程开始会收集许多数据和资料,通过模式概括与抽象把无助于解决问题的特性和模式去掉,留下相关的以及重要的共同属性,直到我们确定一个通用的问题以及建立如何解决这个问题的规则。“抽象”没有固定的模式,它会随着需要或实际情况而有所不同。例如,把一辆汽车抽象化,每个人都有其各自的分解方式,像是车行的业务员与修车技师对汽车抽象化的结果就可能会有差异(如图1-6所示)。

车行业务员:轮子、引擎、方向盘、刹车、底盘。

修车技师:引擎系统、底盘系统、传动系统、刹车系统、悬吊系统。图1-61.1.5 算法

算法是计算思维4个基石中的最后一个,不但是人类使用计算机解决问题的技巧之一,也是程序设计中的精髓,算法常出现在规划和设计程序的第一步,因为算法本身就是一种计划,每一条指令与每一个步骤都是经过规划的,在这个规划中包含解决问题的每一个步骤和每一条指令。

在日常生活中有许多工作可以使用算法来描述,例如员工的工作报告、宠物的饲养过程、厨师准备美食的食谱、学生的课程表等。如今我们几乎每天都要使用的各种搜索引擎都必须借助不断更新的算法来运行,如图1-7所示。图1-7

在韦氏辞典中,算法定义为:“在有限的步骤内解决数学问题的程序。”如果运用在计算机领域中,我们也可以把算法定义成:“为了解决某项工作或某个问题,所需要有限数量的机械性或重复性的指令与计算步骤。”

在计算机中,算法更是不可或缺的重要一环。下面讨论的内容包括计算机程序常涉及算法的概念和定义。在认识算法的定义之后,我们再来看看算法所必须符合的5个条件(参考图1-8和表1-1)。图1-8表1-1

在认识算法的定义与条件后,我们接着来思考:该用什么方法来表达算法最为适当呢?其实算法的主要目的在于让人们了解所执行的工作的流程与步骤,换句话说,算法是描述如何解决问题的办法,因而只要能清楚地体现算法的5个条件,即可清晰地表达算法。

常用的算法一般可以用中文、英文、数字等文字来描述,也就是使用文字或语言语句来说明算法的具体步骤,有些算法则是使用可读性高的高级程序设计语言(如Python、C、C++、Java等)或者伪语言(Pseudo-Language)来描述或说明的。提示

伪语言接近于高级程序设计语言,是一种不能直接放进计算机中执行的语言。一般需要通过一种特定的预处理器(Preprocessor)或者通过人工编写转换成真正的计算机语言才能够加载到计算机中执行,目前较常使用的伪语言有SPARKS、PASCAL-LIKE等。

流程图(Flow Diagram)是一种相当通用的算法表达方式,就是使用某些特定图形符号来表示算法的执行过程。为了让流程图具有更好的可读性和一致性,目前较为通用的是ANSI(美国国家标准协会)制定的统一图形符号。假如我们要设计一个程序,让用户输入一个整数,而这个程序可以帮助用户判断输入的这个整数是奇数还是偶数,那么这个程序的流程图大致如图1-9所示。图1-9提示

算法和过程(Procedure)有何不同?算法和过程是有区别的,过程不一定要满足算法有限性的要求,例如操作系统或计算机上运行的过程。除非宕机,否则永远在等待循环中(Waiting Loop),这就违反了算法五大条件中的“有限性”。1.2 进入程序设计的奇幻世界

程序设计语言其实是一种人类用来和计算机进行沟通的语言,也是用来指挥计算机进行运算或执行任务的指令集合。许多不懂计算机的人可能会把程序想象成十分深奥难懂的技术文件,其实程序只是由一系列合乎程序设计语言语法规则的指令所组成的,程序设计就是编写程序指令或程序代码来指挥计算机辅助我们人类完成各项工作。1.2.1 程序设计语言的分类

随着程序设计语言不断地发展和演进,成就了今日计算机上各种各样软件的蓬勃发展。我们可以把程序设计语言分为主要的三大类:机器语言(Machine Language)、汇编语言(Assembly Language)和高级语言(High-Level Language)。每一代的程序设计语言都有其特色,并且朝着易于使用、调试与维护功能更强的目标不断发展和提升。另外,每一种语言都有其专有的语法、特性、优点以及相关的应用领域。就以机器语言为例,它是最低级的程序设计语言,是以0与1二进制数的方式直接将指令(机器代码)输入计算机,因此在指令级的数据处理上非常高效,但是编程效率最低。

汇编语言则是把以二进制数表示的数字指令用有意义的英文字母、字符表示的指令集来替代,方便人类的记忆与使用。不过,汇编语言编写的程序必须通过汇编器(Assembler)将汇编语言的指令转换成计算机可以识别的机器语言。汇编语言和机器语言相对于高级语言,统称为低级语言(Low-Level Language)。

由于汇编语言与机器语言不易于阅读,因此又产生了一些以英语单词为关键字的程序设计语言,它们被称为高级语言,例如BASIC、FORTRAN、COBOL、PASCAL、Java、C、C++等。高级语言比较符合人类自然语言的形式,也更加容易理解,并提供了程序的控制结构、输入输出指令。当使用高级语言编写完程序之后,在执行前必须先用编译器(Compiler,或称为编译程序)或解释器(Interpreter,或称为解释程序)把高级语言程序转换成汇编语言或机器语言。因此,相对于汇编语言,高级语言在执行效率上要低一些。不过,高级语言的可移植性比汇编语言高,可以在不同架构或硬件平台的计算机上执行。程序设计语言按照“翻译”方式可分为两种,分别说明如下:

·编译型语言

所谓编译型语言,就是使用编译器(Compiler)将程序代码翻译为目标程序。编译器可将源程序分成几个阶段转换为机器可读的可执行文件(目标程序),不过编译器必须先把源程序读入主存储器后才可以开始编译。每当源程序被修改一次,就必须重新经过编译器的编译过程,才能保持其可执行文件为最新的。经过编译后所产生的可执行文件,在执行中不必再“翻译”,因此执行效率较高。例如C、C++、PASCAL、FORTRAN等语言都是编译型语言。如图1-10所示为编译型语言编译与执行过程的示意图。图1-10

·解释型语言

所谓解释型语言,是指使用解释器对高级语言的源代码逐行进行“翻译”(解释),每解释完一行程序语句后,才会解释下一行程序语句,如图1-11所示。如果在解释的过程中发现了错误,解释动作就会立刻停止。由于使用解释器解释的程序每次执行时都必须再解释一次,因此执行速度较慢。BASIC、LISP、PROLOG等高级语言都是解释型语言。图1-111.2.2 程序设计的流程

有些人往往认为程序设计的主要目的就是通过“运行”得出结果,而忽略了程序运行的效率与程序日后维护的成本。学习程序开发的最终目的是学会如何组织众多程序设计人员共同参与来设计一套大型且符合用户需求的复杂系统。一个程序的产生过程可分为五大设计步骤,如表1-2所示。表1-21.2.3 程序编写的原则

至于在程序设计中要使用何种程序设计语言,通常可根据主客观环境的需要进行选择,并无特别的规定。一般从4个方面来评判程序设计语言的优劣。

·可读性(Readability)高:阅读与理解都相当容易。

·平均成本低:成本考虑不局限于编码的成本,还包括执行、编译、维护、学习、调试与日后更新等的成本。

·可靠性高:所编写出来的程序代码稳定性高,不容易产生副作用(Side Effect)。

·可编写性高:针对需求所编写的程序相对容易。

以下是我们在编写程序时应该注意的三项基本原则:

1.适当的缩排

缩排用来区分程序的层级,使程序代码易于阅读,像是在主程序中包含子程序区块,或者子程序区块中又包含其他的子程序区块时,都可以通过缩排来区分程序代码的层级,如图1-12所示。图1-12

2.明确的注释

对于程序设计人员而言,在适当的位置加入足够的注释往往可以作为评断程序设计优劣的重要依据之一。尤其当程序结构复杂而且程序语句较多时,适时在程序中加入注释不仅可提高程序的可读性,而且可以让其他程序设计人员能更清楚地理解这段程序代码的作用。如下这段程序就带有非常清楚的注释:01 import java.util.*;02 public class ch2_02 {03 public static void main(String[] args) {04 //声明变量05 int intCreate=1000000;//产生随机数的次数06 int intRand; //产生的随机数07 int[][] intArray=new int[2][42];//存放随机数的数组08 //将产生的随机数存放到数组中09 while(intCreate-->0) {10 intRand=(int)(Math.random()*42);11 intArray[0][intRand]++;12 intArray[1][intRand]++;13 }14 //对intArray[0]数组进行排序15 Arrays.sort(intArray[0]);16 //找出出现次数最多的前6个数17 for(int i=41;i>(41-6);i--) {18 //逐一检查次数相同者19 for(int j=41;j>=0;j--) {20 //当次数符合时打印输出21 if(intArray[0][i]==intArray[1][j]) {22 System.out.println("随机数号码"+(j+1)+"出现"+intArray[0][i]+"次");23 intArray[1][j]=0; //将找到的数值对应的次数归零24 break; //中断内循环,继续外循环25 }26 }27 }28 }29 }

3.有意义的命名

除了使用明确的注释来辅助程序的阅读外,还要在程序中大量使用有意义的标识符(包括变量、常数、函数、结构等)命名原则。如果使用不恰当的名称,在程序编译时就可能会无法顺利地进行编译,或者造成程序在运行时出现错误。1.3 程序设计逻辑的简介

每位程序设计人员就像一位艺术家一样,会有不同的设计逻辑,不过由于计算机是很严谨的高科技工具,不能像人脑一样天马行空,对于一个好的程序设计人员而言,还是必须遵循某些规范,符合程序设计的逻辑概念,这样才能让程序代码具备可读性与日后的可维护性。就像早期的结构化设计,时至今日已将传统程序设计的逻辑转化成面向对象的设计逻辑,这都是程序设计人员在编写程序时要遵循的大方向。1.3.1 结构化程序设计

在传统程序设计的方法中,主要有“自上而下法”与“自下而上法”两种。所谓“自下而上法”,是指程序设计人员先编写整个程序需求中最容易的部分,再逐步展开来完成整个程序。“自上而下法”则是将整个程序需求从上到下、从大到小逐步分解成较小的单元(或称为模块(Module)),这样使得程序设计人员可针对各个模块分别开发,不但减轻了设计人员的负担,而且程序的可读性更高,对于日后维护也容易许多。

结构化程序设计的核心思想是“自上而下的设计”与“模块化的设计”。例如,在PASCAL语言中,这些模块被称为过程(Procedure),在C语言中被称为函数(Function)。通常“结构化程序设计”具备三种控制流程,而对于一个结构化程序,无论其结构如何复杂,都可使用这三种基本的控制流程来编写,如表1-3所示。表1-31.3.2 面向对象程序设计

面向对象程序设计(Object-Oriented Programming,OOP)的主要设计思想是将存在于日常生活中随处可见的对象(Object)概念应用在软件开发模式(Software Development Model)中。面向对象程序设计让我们在程序设计中能以一种更生活化、可读性更高的设计思路来进行程序的开发和设计,并且所开发出来的程序更容易扩充、修改和维护。

在现实生活中充满了形形色色的物体,每个物体都可视为一种对象。我们可以通过对象的外部行为(Behavior)和内部状态(State)来进行详细的描述。外部行为代表此对象对外所显示出来的运行方式,内部状态则代表对象内部各种特征的当前状况,如图1-13所示。图1-13

例如,我们今天想要自己组装一台计算机,而目前我们人在外地,因为配件不足,找遍了当地所有的计算机配件公司仍找不到所需要的配件,假如我们必须到北京的中关村来寻找所需要的配件。也就是说,一切的工作必须一步一步按照自己的计划分别到不同的公司寻找我们所需的配件。试想,即使节省了不少购买配件的成本,但是时间成本的代价却相当大。

如果换一个角度,假使我们不必理会配件货源如何获得,完全交给计算机公司全权负责,那么事情便会简单许多。我们只需填好一份配置的清单,该计算机公司便会收集好所有的配件,然后寄往我们所指定的地方,至于该计算机公司如何找到货源,便不是我们所要关心的事了。我们要强调的概念便在于此,只要确立每一个配件公司是一个独立的个体,该独立个体有其特定的功能,而各项工作的完成仅需在各个独立的个体之间进行消息(Message)交换即可。

面向对象程序设计的概念就是认定每一个对象是一个独立的个体,而每个独立的个体有其特定的功能,对我们而言,无须理解这些特定功能如何实现这个目标的具体过程,只需要将需求告诉这个独立个体,如果该个体能独立完成,便直接将此任务交给它即可。面向对象程序设计的重点是强调程序的可读性(Readability)、可重复使用性(Reusability)与扩展性(Extension)。

面向对象语言本身还具备三种特性(如图1-14所示),下面逐一介绍。图1-14

·封装

封装(Encapsulation)就是利用“类”来实现“抽象数据类型”(ADT)。类是一种用来具体描述对象状态与行为的数据类型,也可以看成一个模型或蓝图,按照这个模型或蓝图所产生或创建的实例(Instance)就称为对象。类和对象的关系如图1-15所示。图1-15

所谓“抽象”,就是将代表事物特征的数据隐藏起来,并定义一些方法(Method)来作为操作这些数据的接口,让用户只能接触到这些方法,而无法直接使用数据,也符合信息隐藏(Information Hiding)的要求,而这种自定义的数据类型就称为“抽象数据类型”。而传统程序设计的概念则必须掌握所有的来龙去脉,就程序开发的时效性而言,传统程序设计便要大打折扣。

·继承

继承(Inheritance)是面向对象程序设计语言中最强大的功能之一,因为它允许程序代码的重复使用(Code Reusability),同时可以表达树结构中父代与子代的遗传现象。继承类似于现实生活中的遗传,允许我们定义一个新的类来继承现有的类(Class),进而使用或修改继承而来的方法(Method),并可在子类(SubClass)中加入新的成员数据与成员方法。在继承关系中,可以把它单纯视为一种复制(Copy)的操作。换句话说,当程序开发人员以继承机制声明新增的类时,它会先将所引用的父类中的所有成员完整地写入新增的类中。类继承关系的示意图如图1-16所示。图1-16

·多态

多态(Polymorphism)是面向对象程序设计的重要特性,也被称为“同名异式”。多态的功能可让软件在开发和维护时实现充分的扩展性。多态,按照英文单词字面的解释就是一样东西同时具有多种不同的形态。在面向对象程序设计语言中,多态的定义简单来说是利用类的继承关系先创建一个基类对象。用户通过对象的继承声明将此对象向下继承为派生类对象,进而控制所有派生类的“同名异式”成员方法。

简单地说,多态最直接的定义就是让具有继承关系的不同对象可以调用相同名称的成员方法,并产生不同的运行或计算结果。1.3.3 在面向对象程序设计中的其他关键术语

·对象

对象(Object)可以是抽象的概念或一个具体的东西,包括数据(Data)及其相应的操作或运算(Operation),或称为方法(Method)。对象具有状态(State)、行为(Behavior)与标识(Identity)。

每一个对象均有其相应的属性(Attribute)及属性值(Attribute Value)。例如,有一个对象称为学生,“开学”是一条消息,可传送给这个对象。而学生有学号、姓名、出生年月日、住址、电话等属性,当前的属性值便是其状态。学生对象的操作或运算行为则有注册、选修、转系、毕业等,学号则是学生对象的唯一识别编号(对象标识,OID)。

·类

类(Class)是具有相同结构和行为的对象集合,是许多对象共同特征的描述或对象的抽象化。例如,小明与小华都属于人这个类,他们都有出生年月日、血型、身高、体重等类的属性。类中的一个对象有时就称为该类的一个实例(Instance)。

·属性

属性(Attribute)用来描述对象的基本特征及其所属的性质,例如一个人的属性可能会包括姓名、住址、年龄、出生年月日等。

·方法

方法(Method)是对象的动作与行为,我们在此以人为例,不同的职业,其工作内容就会有所不同,例如学生的主要工作为学习,而老师的主要工作则为教书。1.4 Java语言的特性

Java语言源于1991年Sun Microsystem(太阳计算机系统,简称Sun公司)公司内部一项名为Green的开发计划,是为了编写控制消费类电子产品软件所开发出来的小型程序设计语言系统,不过这项计划并未获得市场的肯定,因而沉寂了一段时间。但是,不久之后,由于因特网的蓬勃发展,谁也没有想到当初只是为了在不同平台系统下执行相同软件而开发的语言工具,却意外地引发了一股技术发展的潮流。于是,Sun公司对Green计划重新进行了评估并做了修正,在1995年正式向外界发表名为“Java”的程序设计语言系统。

Java之所以会成为令人瞩目的程序设计语言,主要原因之一就是因为Java具有“支持Web”的功能,可以在Web平台上设计和编写出“互动性高”与“跨平台”的程序。再加上Java语言面向对象、支持泛型程序设计的特性,因而如今Java语言已经深入日常生活中的各个领域,例如IC卡(通用智能卡)、金融卡(如银行智能卡)、身份识别证等应用。另外,还有智能设备、无线通信等应用,以及开发大规模的商业应用等各个方面,我们都可以看到无所不在的Java应用。

Java是一种面向对象的高级程序设计语言,Java语言的应用范围涵盖因特网、网络通信及智能通信设备,并成为企业构建数据库的较佳开发工具。Java语言的风格十分接近C++语言,在保有C++语言面向对象技术核心的同时,还舍弃了C++语言中容易引起错误的指针,并以引用功能取而代之,经过多次的修正、更新,Java逐渐成为一种功能完备的、面向对象的程序设计语言。Sun公司就曾提到Java语言的几项特点:简单性、面向对象、解释性、严谨性、跨平台性、高性能、多线程。1.4.1 简单性

Java语法源于C++语言,因此它的指令和语法十分简单,我们只要能了解简单英文单词与语法的概念,就能进行程序设计并完成运算处理的工作。Java具有以下两点简单特性:(1)简化了语法:Java简化了C++中的一些用法,并舍弃了不常用的语法,如容易造成内存存取问题的指针(Pointer)和多重继承的部分。(2)垃圾回收机制(Garbage Collection):Java使用了垃圾回收机制,当程序中有不再使用的资源时,系统会自动释放其占用的内存空间,从而减少程序设计者自行管理内存资源不足的困扰。1.4.2 跨平台性“跨平台性”表示Java的程序不依赖于任何一个特定的硬件平台,Java程序的特点是“一次编译、到处执行”,也就是说,Java程序在编译后可以不用再经过任何更改就可以在任何支持Java的硬件设备或平台上顺利执行。基本上,无论是哪一种操作系统(Windows、UNIX/Linux或Solaris)、哪一种硬件平台(PC、个人数字设备、Java Phone或智能家电等),只要它们搭载有JVM(Java Virtual Machine,Java虚拟机)执行环境,即可顺利执行已事先编译的Java Bytecode(字节码),如图1-17所示。也就是说,执行Java应用程序必须先安装Java Runtime Environment(JRE),JRE内部包含JVM以及一些标准的Java类库。通过JVM才能在系统中执行Java应用程序(Java Application)。

当程序设计人员设计和编写好的Java源程序通过不同操作系统平台上的编译器(例如Intel的编译器、Mac OS的编译器、Solaris的编译器或者UNIX/Linux的编译器)进行编译后,产生相同的Java虚拟机字节码(Byte Code),然后这些Java虚拟机字节码再通过不同操作系统平台的解释器,翻译成该系统平台的机器码。因此,Java是建立在软件平台上的程序设计语言,而让Java实现跨平台运行的主要因素就是JVM(Java虚拟机)和Java API。图1-171.4.3 解释型

Java源程序(Java Source)必须通过内建的实用程序javac.exe来进行编译,把Java程序的源代码编译成目标执行环境中可识别的字节码(Bytecode),字节码是一种虚拟的机器语言,而在目标环境中的执行是通过实用程序java.exe对字节码以解释方式按序执行的,这个过程如图1-18所示。图1-181.4.4 严谨性

Java程序是由类与对象所组成的,编程人员可将程序分割为多个独立的代码段,并将相关的变量与函数写入其中,相当严谨地分开处理程序的各种不同执行功能。1.4.5 例外处理

例外(Exception)是一种运行时的错误,在传统的计算机程序设计语言中,当程序发生错误时,程序设计人员必须自行编写一部分程序代码来进行错误的处理。不同于其他高级程序设计语言,Java语言会在运行期间发生错误的时候自动抛出例外对象以便进行相关的处理工作。我们可使用try、catch与final三个例外处理程序区块,以“专区专责”的方式解决程序运行期间可能遇到的错误。1.4.6 多线程

Java内建了Thread类,其中包含各种与线程处理相关的方法(Method),真正实现同一时间执行多个程序运算。多线程是在每一个进程(Process)中包含多个线程(Thread),将程序分割成一些独立的工作,如果运用得当,多线程可以大幅度提升系统运行的性能。1.4.7 自动垃圾回收

相对于大多数C++编译器不支持垃圾回收机制,Java语言有自动垃圾回收(Garbage Collection)机制,这个特点受到许多从使用C++语言转到使用Java语言的程序设计人员的欢迎。这是因为许多C++程序设计人员在进行程序初始化操作时,必须在主机内存堆栈中分配一块内存空间,当程序运行结束后,必须通过指令的下达来释放被分配的内存空间。不过,一旦程序设计人员忘记回收这块内存空间,就会造成内存泄漏(Memory Leak)而浪费内存空间。因为Java语言有自动垃圾回收机制,所以当一个对象没有被引用时,就会自动释放这个对象所占用的内存空间,从而避免内存泄漏的现象。1.4.8 泛型程序设计

泛型程序设计(Generic Programming)是程序设计语言的一种风格。泛型在C++中其实就是模板(Template),只是Swift、Java和C#采用了泛型(Generic)这个更广泛的概念。泛型可以让程序设计人员根据不同数据类型的需求编写出适用于任何数据类型的函数和类。我们或许可以这么说:泛型是一种类型参数化的概念,主要是为了简化程序代码,降低日后程序的维护成本。泛型语法让我们在编写Java程序时可以指定类或方法来支持泛型,而且在语法上更为简洁。Java语言中引入泛型的功能后,这项重大改变使得语言、类型系统和编译器有了许多不同以往的变化,其中许多重要的类(例如集合框架)已经成为泛型化的类了,它带来了很多好处,还提高了Java程序的类型安全。1.5 Java的开发环境版本与架构

在Java SE 11之前的几个版本的改版时间间隔都较短,例如2017年9月21日,Oracle公司发布了Java SE 9,接着大概过了半年时间,Oracle公司于2018年3月21日发布了Java SE 10,又差不多过了半年时间,Oracle官方于2018年9月25日正式发布了Java SE 11(Java SE Development Kit 11)。1.5.1 程序开发工具介绍

Java的开发工具分成JDK和IDE两种:(1)Java开发工具(Java Development Kit,JDK)是一种“简易”的程序开发工具,仅提供编译(Compile)、执行(Run)及调试(Debug)功能。(2)集成开发环境(Integrated Development Environment,IDE)集成了编辑、编译、执行、测试及调试功能,例如常见的Borland Jbuilder、NetBeans IDE、Eclipse、Jcreator、Java Editor等。1.5.2 JDK的下载与安装

由于Java支持各种操作系统,因此可根据自己使用的操作系统版本来下载对应的安装程序。目前大部分的开发环境都必须另行安装JDK,不过也有部分集成开发环境在安装时会同时安装JDK。下面我们将以Windows 10/Windows 7平台来示范JDK 11的安装过程。首先到Java的官方网站(http://www.oracle.com/technetwork/java/index.html)下载最新版的JDK,如图1-19所示。图1-19

在图1-19所示的Java官方网站中,单击网页右侧的“Java SE 11.0.1”链接,接着会显示出如图1-20所示的网页。图1-20

在图1-20所示的网页中单击“Java SE Downloads”下方的“DOWNLOAD”按钮(框中的按钮),随后会显示出如图1-21所示的网页,读者可以根据网页中的提示下载JDK。要开始下载,可选中如图1-21所示的网页中的Accept License Agreement单选按钮。图1-21

笔者根据自己的操作系统下载的是Windows版本的JDK,文件名为“jdk-11.0.1_windows-x64_bin.exe”,如图1-22所示。图1-22

下载完安装文件后,单击“运行”按钮,即可执行该安装程序,如图1-23所示。图1-23

JDK 11的安装向导界面如图1-24所示。图1-24

步骤01 直接在如图1-24所示的安装向导界面中单击“下一步”按钮,随即显示出如图1-25所示的安装界面,接着选择JDK安装组件及安装路径,默认的安装路径是“C:\Program Files\Java\jdk-11.0.1\”。建议使用这个默认设置,接下来单击“下一步”按钮,开始安装。图1-25

步骤02 接着就会开始进行文件的安装、复制,这个部分可能需要几分钟,请耐心等候。当安装完成并完成相应的设置后,就会出现安装完成的界面,如图1-26所示,单击“关闭”按钮,即可完成JDK的安装。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载