
第1章 Java程序设计概述
1.1 Java语言简介
1.1.1 程序与程序设计语言
20世纪30年代中期,美籍匈牙利科学家冯·诺依曼提出了存储程序与程序控制的计算机基本原理,奠定了现代计算机技术的基础。存储程序是指事先把程序及运行中所需的数据输入并存储在计算机的内存中。程序控制是指计算机运行时自动地逐一取出程序中的一条条指令,加以分析,并执行规定的操作。程序是什么?一般所说的程序,如运动会的程序、音乐会的程序等,是指事情安排的先后次序。为了使计算机能完成某一任务,人们预先把动作步骤用一系列指令表达出来,这个指令序列就称为计算机程序。
指令是指示计算机执行某种操作的命令,计算机的指令系统是一台计算机所能执行的各种不同类型指令的集合,反映了计算机的基本功能。其中,一条指令对应一个最基本的操作,如实现一个加法运算或实现一个数据的传送操作。虽然指令系统中指令的个数有限,每个指令所能完成的功能也只是非常基本的操作,但一系列指令的组合却能完成许多很复杂的功能,这也正是计算机的奇妙之处。
程序是计算机的灵魂,没有程序,计算机可以说是一堆废物。计算机首先要求人们在程序设计上付出大量的创造性劳动,然后才能享受它提供的服务。为计算机编制程序是一项具有挑战性和创造性的工作,计算机问世的70多年来,人们一直在研究各种各样的程序,使计算机完成各种各样的任务。
人类的自然语言是人与人交流的工具,程序设计语言包涵向计算机描述计算过程所需的词法和语法规则,它的主要用途是给计算机编写工作顺序,编写程序的过程就称为“程序设计”。从计算机问世至今,人们一直在为研制更好的程序设计语言而努力着,程序设计语言的数量在不断增多,目前已问世的程序设计语言非常多,但这其中只有极少数得到了人们的广泛认可。程序设计语言在发展过程中经历了由低级到高级的过程,一般分为机器语言、汇编语言和高级语言。
1.机器语言
机器语言是最原始的程序设计语言。机器语言提供了一组二进制形式的机器指令,每个机器指令能让计算机完成一个基本的操作,机器指令及其含义是由计算机硬件的设计者定义的。用机器语言编写的程序,可以被计算机直接识别和执行。由于不同类型计算机系统的机器语言一般有所不同,所以一种机器编写的程序不能直接在另一种机器上运行。
用机器语言编写程序非常枯燥和烦琐,要记住每条指令的二进制代码与含义非常困难,要阅读和理解机器语言程序同样非常困难。
2.汇编语言
汇编语言用符号表示机器指令的运算符与运算对象,例如,用“ADD”代替“1010”表示加法操作,用“MOV”代替“0100”表示数据传送。用汇编语言编写的程序需要经过一个专门的翻译程序的处理,将其中的汇编语言指令逐条翻译成相应的机器指令后才能执行。虽然汇编语言一定程度上克服了机器语言难以阅读和记忆的缺点,但对大多数用户来说,理解和使用仍然是很困难的。
3.高级语言
汇编语言和机器语言都属于低级语言,其缺点是依赖于机器,可移植性、可读性、可维护性差。
高级语言与人们所习惯的自然语言、数学语言比较接近,与低级语言相比,具有自然直观、易学易用等优点。目前比较流行的高级语言有:Java、C、C++、Python、PHP等,这些语言具有各自不同的特色、侧重点和适用领域,存在一定的差异。不过,高级语言本质上是相通的,掌握了一门经典语言之后,再学习其他语言会非常容易。
用高级语言编写的程序不能直接被计算机执行。每种高级语言都有自己的语言处理程序,语言处理程序的功能是将用高级语言编写的程序转换成计算机能直接执行的机器语言程序。转换方式有两种:解释方式和编译方式。在解释方式下,解释程序逐条地读取源程序语句,将语句解释成机器指令并提交给计算机硬件执行。这类似于新闻发布会中的翻译,演讲者讲一句,翻译者翻译一句。编译方式下,语言处理程序将源程序文件翻译成计算机系统可以直接执行的机器指令程序文件。
目前比较流行的程序设计语言中,C语言采用编译方式,Basic语言采用解释方式。Java语言是一种比较特殊的高级语言,它采用先编译、再解释的执行方式。也就是先把Java语言的源程序编译成字节码程序,然后在运行时由Java解释器对字节码程序进行解释执行。
1.1.2 Java语言的发展
Java语言的前身是Oak语言,由Sun公司的一个研究小组开发完成,其研制的初衷是希望用Oak开发的应用程序可以在智能家电上跨平台运行。尽管Oak是一种跨平台、精巧而安全的语言,但由于智能家电的发展没有预想得那么快,而Sun公司又在投标一个交互式电视大项目时败北,所以Oak语言举步维艰,几乎走向末路。
1995年开始,互联网的蓬勃发展给Oak带来了新的机遇。Internet上的计算机硬件和操作系统往往种类多样,例如,Sun工作站的硬件是SPARC体系,操作系统是UNIX,而PC机的硬件是Intel体系,操作系统是Windows或Linux。Internet上迫切需要一种跨平台的编程语言,使程序在网络中的各种计算机上能够正常运行。考虑到Oak具有跨平台的特征,Sun公司将Oak语言的应用背景转向网络市场,将Oak更名为Java。
1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),这是Java发展历程中的重要里程碑,标志着Java成为了一种独立的开发工具。9月,约8.3万个网页应用了Java技术来制作。
后来,Sun公司发布了第二代Java平台(简称Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。Java2平台的发布,标志着Java的应用开始普及。2005年6月,J2EE、J2SE和J2ME分别更名为Java EE,Java SE和Java ME。2009年4月,甲骨文公司通过收购Sun公司获得了Java的版权。2014年,甲骨文公司发布了Java8。
由于符合Internet时代的发展要求,Java语言获得了巨大的成功,已经成为软件开发领域内最流行的开发语言之一,近几年,市场对Java程序开发人才的需求一直旺盛。TIOBE编程语言排行榜是反映程序设计语言当前流行程度的一个指标,该排行榜每月更新一次。在该榜单上,Java语言多年来大多位于第一名,如表1-1所示。
表1-1 程序设计语言市场占有率(2018年8月)

1.1.3 Java语言的特点
Java是一种面向对象的程序设计语言。总体上说,Java语言具有简单易学、安全性、平台无关性、多线程机制等特点。
Java语言相对简单易学。Java的语法和C++非常相似,但是它摒弃了C++中很多低级、困难、容易混淆、容易出错或不经常使用的功能。例如,运算符重载、指针运算、程序的预处理、结构体、多重继承,与经典的程序设计语言C++相比,Java更加简单易学。
Java语言具有较好的安全性。一方面,指针和释放内存等功能被Java摒弃,从而避免了非法内存操作的可能性;另一方面,Java程序在执行过程中会经过多次监测。首先,必须经过字节码校验器的检查,然后,Java解释器将决定程序中类的内存布局,随后,Java类装载器负责把来自网络的类装载到单独的内存区域中,避免程序之间相互干扰。此外,用户还可以限制来自网络的类对本地文件系统的访问。
平台无关性是Java语言的最重要的特性。所谓平台,是指程序运行的硬件和软件环境。一般的高级语言程序,如果要在不同的平台上运行,需要编译成不同的可执行代码。而Java语言允许编程者一次性编写程序代码,并可以在不同的平台上运行。从IBM的大型机到Sun公司的UNIX服务器,再到Windows的PC,甚至在移动电话和嵌入式系统中,Java程序都能运行,且不需要针对每个计算机硬件和操作系统配置的不同而改动程序代码。
Java虚拟机(Java Virtual Machine,JVM)是实现平台无关性的关键,是由Java系统提供的一个软件,其任务是执行Java程序。编译系统先对Java源程序进行编译处理,生成一种与平台无关的字节码程序(也就是.class文件)。这种字节码程序本身并不能直接在计算机系统上运行,而必须通过JVM来解释执行。因此,一般认为Java语言既不是纯粹的编译型语言,也不是纯粹的解释型语言。
目前,各种类型的计算机系统基本都有各自对应的Java虚拟机,负责将Java字节码程序转换为对应平台计算机的机器码,从而可以执行。正是Java虚拟机,使Java程序在一次编译之后,便能在不同硬件和操作系统平台上执行。它之所以称为虚拟机,是因为并没有某个计算机系统可以直接执行Java程序,而是依赖Java虚拟机这样一个软件,将计算机变成一个可以执行Java程序的虚拟计算机。
高级程序设计语言经历了从面向过程到面向对象的发展。面向对象技术较好地解决了面向过程的软件开发中出现的种种问题,比原有的面向过程的语言有更好的可维护性、可重用性和可扩展性,有利于提高程序的开发效率。C++从C发展而来,具备了面向对象的特征,也保留着对C的兼容。Java是一种较为纯粹面向对象程序设计语言。