1991年,Sun公司为了进军家用电子消费市场,成立了一个代号为Green的项目组。 Oak(橡树)系统出现。
Oak以C++语言为蓝本,吸收了C++中符合面向对象程序设计要求的部分,同时加入了一些满足网络设计要求的部分。
1994年,Green项目组成员认真分析计算机网络应用的特点,认为Oak满足网络应用所要求的平台独立性、系统可靠性和安全性等,并用Oak设计了一个称为WebRunner(后来称为HotJava)的WWW浏览器。
1995年5月23日,Sun公司正式发布了Java和HotJava两项产品。
Java语言一经推出,就受到了业界的关注。Netscape公司第一个认可Java语言,并于1995年8月将Java解释器集成到它的主打产品Navigator浏览器中。接着,Microsoft公司在Internet Explorer浏览器中认可了Java语言。Java语言开始了自己的发展历程。
目前使用的Java版本是Java2,它包括J2SE、J2EE、J2ME三个版本,分别用于不同的领域。
J2SE(Java Standard Edition)—用于工作站、PC机,为桌面开发和低端商务应用提供了Java标准平台。
J2EE(Java Enterprise Edtion)—用于服务器,构建可扩展的企业级Java平台。
J2ME(Java Micro Edtion)—嵌入式Java消费电子平台,适用于消费性电子产品和嵌入式设备。
Java语言是简单的、面向对象的语言,它具有分布式、安全性,又可以实现多线程,更主要的是它与平台无关,解决了困扰软件界多年的软件移植问题。
面向对象(object-oriented)程序设计模式是近代软件工业的一种革新,它提供软件的弹性度(flexibility)、模块化(modularity)与重复使用率(resability),降低开发时间与成本。Java是完全对象化的程序语言,编程重点在于产生对象、操作对象以及如何使对象能一起协调工作,以实现程序的功能。
Java语言的语法结构类似于C和C++,熟悉C++的程序设计人员不会对它感到陌生。与C++相比,Java对复杂特性的省略和实用功能的增加使得开发变得简单而可靠,
平台无关性是指Java能运行于不同的系统平台。Java引进虚拟机概念,Java虚拟机(Java Virtual Machine,称为JVM)建立在硬件和操作系统之上,用于实现对Java字节码文件的解释和执行,为不同平台提供统一的Java接口。这使得Java应用程序可以跨平台运行,非常适合网络应用。
安全性是网络应用系统必须考虑的重要问题。Java设计的目的是提供一个网络/分布式的计算环境,因此,Java特别强调安全性。Java程序运行之前会利用字节确认器进行代码的安全检查,确保程序不会存在非法访问本地资源、文件系统的可能,保证了程序在网络间传送运行的安全性。
Java为程序开发提供了Java.net包,该包提供了一组类,使程序开发者可以轻易实现基于TCP/IP的分布式应用系统。此外,Java还提供了专门针对互联网应用的一整套类库,供开发人员进行网络程序设计。
Java语言内置了多线程控制,可使用户程序并行执行。利用Java的多线程编程接口,开发人员可以方便地写出多线程的应用程序。Java语言提供的同步机制可保证各线程对共享数据的正确操作。在硬件条件允许的情况下,这些线程可以直接分布到各个CPU上,充分发挥硬件性能,提高程序执行效率。
Java程序的运行必须经过编写、编译、运行三个步骤。
编写是指在Java开发环境中进行程序代码的输入,最终形成后缀名为.java的Java源文件。
编译是指使用Java编译器对源文件进行错误排查的过程,编译后将生成后缀名为.class的字节码文件,这不像C语言那样最终生成可执行文件。
运行是指使用Java解释器将字节码文件翻译成机器代码,执行并显示结果。这一过程如图1.1所示。
字节码文件是一种和任何具体机器环境及操作系统环境无关的中间代码,它是一种二进制文件,是Java源文件由Java编译器编译后生成的目标代码文件。编程人员和计算机都无法直接读懂字节码文件,它必须由专用的Java解释器来解释执行,因此Java是一种在编译基础上进行解释运行的语言。
Java解释器负责将字节码文件翻译成具体硬件环境和操作系统平台下的机器代码,以便执行。因此Java程序不能直接运行在现有的操作系统平台上,它必须运行在被称为Java虚拟机的软件平台之上。
Java虚拟机(JVM)是运行Java程序的软件环境,Java解释器就是Java虚拟机的一部分。在运行Java程序时,首先会启动JVM,然后由它来负责解释执行Java的字节码,并且Java字节码只能运行于JVM之上。这样利用JVM就可以把Java字节码程序和具体的硬件平台以及操作系统环境分隔开来,只要在不同的计算机上安装了针对于特定具体平台的JVM,Java程序就可以运行,而不用考虑当前具体的硬件平台及操作系统环境,也不用考虑字节码文件是在何种平台上生成的。JVM把这种不同软硬件平台的具体差别隐藏起来,从而实现了真正的二进制代码级的跨平台移植。JVM是Java平台无关的基础,Java的跨平台特性正是通过在JVM中运行Java程序实现的。Java的这种运行机制可以通过图1.2说明。
Java语言这种“一次编写,到处运行(write once,run anywhere)”的方式,有效地解决了目前大多数高级程序设计语言需要针对不同系统来编译产生不同机器代码的问题,即硬件环境和操作平台的异构问题,大大降低了程序开发、维护和管理的开销。
需要注意的是,Java程序通过JVM可以达到跨平台特性,但JVM是不跨平台的。也就是说,不同操作系统之上的JVM是不同的,Windows平台之上的JVM不能用在Linux上面,反之亦然。
面向对象程序设计(Ojbect-Oriented Programming,OOP)是近代软件设计领域的一大革命。在大型系统的开发中,OOP技术使得程序结构简单,相互协作容易,更重要的是提高了程序的重复使用率,并降低了维护成本。
Java语言是一种完全面向对象的程序设计语言,它通过类、对象等概念来组织和构建整个程序,因此,理解面向对象的基本概念是学习Java的前提和基础。
所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。
类是具备某些共同特征的对象的集合,用程序设计的语言来说,类是一种抽象的数据类型。
类是对对象的抽象,而对象是对类的具体化。
面向对象的程序设计方法,首先是进行合理的抽象,即把问题中涉及的客观实体分割出来,抽取其共同的属性和方法;然后根据抽象出的结果设计可重复使用的类;通过类去定义一个个的对象(称为类的实例化)。最后,按照问题的要求,操作对象实现软件的功能。
在面向对象的程序设计中,描述对象特征的属性由变量来表示,也称为数据;
描述对象行为的方法由函数来实现。这样对象就是数据加方法。
将数据及对数据的操作方法捆绑在一起构成类,就是所谓的封装。这是面向对象程序设计的重要特性之一。
无论一个对象方法的目的是什么,最终都表现为对对象数据的操作,包括把对象的状态告知外界以及改变对象的状态等。只要有足够的方法,就没有必要去直接操作对象的属性,对象与外界打交道全部通过其自身的方法来实现。封装性有效地把对象的属性隐藏在对象的内部,以避免属性被不正当的存取。同时,对于外界而言,不需要了解对象的方法是如何工作的,只需要知道对象有哪些方法以及如何调用这些方法。就好比一辆汽车要停车,你并不需要知道变速箱、液压系统、刹车系统等机构的细节如何运作,只要踩下离合器和刹车踏板即可。因此,封装使得程序的设计与实现有效地分开,降低了方法之间的相互依赖,提高了对象之间的独立程度,提升了程序的可维护性。
继承是指在一个已有类的基础上,通过添加新的数据和方法,从而构成一个新类的过程。继承是一种机制,它使得一个新类不仅拥有自己独特的数据和方法,而且具有被继承类的数据和方法,但却不用写重复的代码,实现了代码复用,方便了功能扩充。由继承得到的类称为子类,被继承的类叫做父类或超类。
多态,这个词是从希腊文而来,意思是“许多状态”。在同一个类中可有许多同名的方法,但其参数数量与类型不同,这些同名不同参数的方法之间构成多态。
作为面向对象的设计语言,Java很好地实现了类的封装、继承、多态。这将在以后的内容中逐步展开学习。
Java不仅提供了一个丰富的语言和运行环境, 而且还提供了一个免费的Java软件开发工具集(Java Developement Kits, 简称JDK)。到目前为止,Sun公司先后发布了多个主要的JDK的版本。其主要版本的发布时间和特点如下:
① JDK1.0:1995年推出,是Java最早的编译环境。
② JDK 1.2:1998年发布,在图形化用户界面、数据库互连以及其他许多方面作了重大改进。这个版本也称作带有JDK 1.2的Java 1.2版本。由于该版本具有重大改变,所以从Java 1.2版本后的Java语言也称作Java 2语言。
③JDK 1.3:在多媒体应用、编译速度等方面做了改进。
④JDK 1.4:是目前的最新版本。
通常所说的J2SDK,是指与Java 2语言相对应的Java SDK(Java Software Developement Kits),它是对较新版本中JDK的一个特定称呼。J2SDK(JDK)包括Java的编译器、解释器、调试器等开发工具以及Java API类库。编程人员和最终用户可以利用这些工具来开发java程序。其调试工具主要包括Java语言编译javac,用于编译Java源程序;Java字节码解释器java,用于解释运行Java程序,显示程序运行结果;小应用程序浏览工具appletviewer,用于测试并运行Java小程序。
为了建立起Java的运行环境,可以到SUN公司的网站(http://www.sun.com)上下载最新的JDK。建议同时下载其Java Documentation,这是Java帮助文档。
以JDK1.4.2版的J2SDK为例(即j2sdk 1.4.2),运行下载的j2sdk-1_4_2_02-windows-i586.exe文件,开始进行Java环境的正式安装。默认安装于c:/j2sdk1.4.2目录下,用户可以更改这个默认安装目录,但建议安装路径不要有空格,因此不宜安装在/Program Files目录下。
接下来需要设置运行环境参数,以便能够在Windows的任何目录下面都能编译和运行Java程序。对于使用Win95/98的用户,需要编辑autoexec.bat文件,在其最后面添加如下的2行语句,保存文件并重新启动系统。
set path=%path%;c:/j2sdk1.4.2/bin
set classpath=.; c:/j2sdk1.4.2/lib
对于Win2000或xp的用户,使用鼠标右击【我的电脑】,依次选择【属性】│【高级】│【环境变量】,打开【环境变量】对话框,在【系统变量】列表框中,单击【新建】按钮,新建环境变量classpath,其变量值为“.; c:/j2sdk1.4.2/lib”;选择path变量,单击【编辑】按钮,在path变量的变量值后面加上“;c:/j2sdk1.4.2/bin”。或者,直接编辑path变量,在其变量值后面加上“;c:/j2sdk1.4.2; c:/j2sdk1.4.2/lib;c:/j2sdk1.4.2/bin”。
Java源程序是一种文本文件,可以使用任何的文本编辑器编写,只是要注意存储时的文件名后缀名必须是.java。建议读者把所有源程序文件都保存在一个指定的目录下,便于调试和运行。
这里向大家推荐两种编辑器:一是Windows的记事本,一是文本编辑工具UltraEdit和EditPlus。使用Windows记事本编辑Java源程序文件,存储时先选择*.*(所有文件)的文件类型,然后,输入带有.java后缀的文件名;或者直接以带英文双引号“XXXX.java”的形式输入文件名。UltraEdit和EditPlus是两个非常易用且功能强大的文本编辑工具。编辑时,它们自动地把关键字、常量、变量等不同元素用不同的颜色区分开来,从而有助于减少语法错误。
如果读者习惯使用像Word这类文字处理软件,则应注意不要在文件中加入任何格式排版信息,确保得到的文件是文本文件。应当指出,尚有其它的Java开发工具可供选择,如JCreator、JBuilder 、Eclipse、NetBean、Visual J++等。
Java是解释型语言。Java源程序必须先由Java编译器进行编译,生成字节码文件(也称类文件),然后在Java解释器的支持下解释运行。
Java编译器是javac.exe,其用法如下:
javac filename.java
其中filename.java是java源程序文件的文件名。如果编译器没有返回任何错误信息,则表示编译成功,并在同一目录下生成与类名相同的字节码文件filename.class。如果编译出错,则需查找错误原因,进一步修改源程序,并重新编译。
Java解释器是程序java.exe,其用法如下:
java filename
其中filename是编译生成的java字节码文件的文件名,注意不要带后缀名.class。
Java有两类程序,即Java应用程序(Java application)和Java小程序(Java applet),前者是在命令行中运行的独立的应用程序,它类似于以往用其他高级语言开发的程序;后者需要嵌入网页在浏览器中执行。关于Java小程序的问题将在本书第9章介绍,本节介绍Java应用程序的一个简单示例,以此来学习Java应用程序的开发流程,并了解程序的基本结构。
【例1.1】编写一个应用程序,在屏幕上显示字符串“Hello, World!”。
第一步,编写源程序。使用记事本编写程序的源代码,代码的内容如图1.3。将源代码保存为文件HelloWorld.java,并存放在一个指定的目录例如C:/test中。注意:输入文件名时必须区分大小写。
图1.3HelloWorld程序
第二步,编译源程序。在Win2000中,单击【开始】│【运行】命令,在命令行上输入“cmd”并按回车键,打开一个MS-DOS命令窗口(在Windows 98中输入“command”,按回车键);将当前目录转换到Java源程序所在的目录C:/test;输入“javac filename.java”形式的命令进行程序编译。本例应输入“javac HelloWorld.java”。如果编译正确的话,显示如图1.4。
图1.4HelloWorld程序编译结果
第三步,执行程序。在同样的命令窗口中输入“java filename”形式的命令执行程序,本例应输入“java HelloWorld”,运行结果如图1.5所示。
图1.5HelloWorld程序运行结果
至此,完成了这个简单程序的开发。查看C:/test目录,其中应该有两个文件,分别是HelloWorld.java和HelloWorld.class。
通过上述的Hello World程序,可以发现Java应用程序基本框架如下:
public class 类名{
public static void main ( Stringargs [ ] ){
……….//程序代码
}
//其他属性和方法
}
在下面的分析中,为了叙述方便,我们特地为Hello World程序的源代码行增加上编号:
1 /* HelloWorld.java */
2public class HelloWorld {
3public static void main(String args[]) {
4System.out.println("Hello, World!");
5}
6}
第1行是注释行。Java语言主要有三种注释:形如“/* 注释内容*/ ”的格式,可以注释一行或多行文本;形如“// 注释内容”的格式,可以注释一行文本;形如“/** 注释内容*/ ”的格式,可以注释一行或多行文本,并可用于生成专门的Javadoc。注释可以放在一行的开头或某个语句之后,为程序增加必要的解释,提高程序的可读性。
第2行是类的定义。使用关键字class定义了一个HelloWorld类,class前面的public关键字表示这个类的访问特性是公共的。
Java语言中的基本程序单位是类,一个程序文件可以定义多个类,但仅允许有一个公共的类。源程序的文件名要与公共类的名称相同(包括大小写),其扩展名为.java。因此,HelloWolrd程序的源程序文件名必须是HelloWorld.java。
第2行最后到第6行的一对花括号,其内部是类体。类体中可以声明类的变量(属性)和类的方法(函数),它们是类的成员。本例中没有声明类的成员变量。
第3行是类的成员方法的声明,这是一个主方法main。Java应用程序必须含有一个主方法。public关键字表示这个方法是公共的,可以从其它类中访问;static关键字表示这个方法是静态的,指出这个方法是针对这个类而不是针对类生成的对象;void关键字表示这个方法没有返回值。
一个类可以声明多种方法,但最多只能有一个主方法main。应用程序从main方法获得入口点开始运行,并通过主方法调用类中的其它方法。
main方法后的小括号中是方法的参数列表,它们是方法内的局部变量,接收从外部向main方法中传递的参数。它通常写成String args[],表明所接收的参数是一个名为args的字符串数组。
第3行最后到第5行的一对花括号,其内部是方法体。在方法体内部,可以声明方法的局部变量及书写执行语句,实现数据处理功能。
第4行是main方法唯一的一个语句,其作用是在标准输出设备(屏幕)上输出一行字符“Hello, World!”。这是一个字符串,必须用引号括起来。最后的分号是必须的,表明这是一条Java语句。
为了实现屏幕输出,这里使用了系统包java.lang中的System类,该类中有静态成员变量out,它是一个标准输出流,主要用于输出用户信息,通过out调用标准输出流类中的println方法。println方法将作为参数的字符串输出到屏幕并换行。与此相似的方法是print,不同之处是print输出内容后不换行。
Java语言系统以包的形式提供了许多的标准类库,这些类库是编制Java程序的基础。调用类库中的方法之前,先要使用import语句导入相应的类库(包),而系统包java.lang是Java最基本的类库,由系统自动导入,因此,Hello World程序没有使用import语句。