Java基础知识 Java是一种基于C和C++语法的纯面向对象的编程语言。本章首先向读者介绍了Java语言的发展史、Java语言的特点、Java的基本元素以及什么是面向对象编程,使读者对Java语言有个基本认识,然后介绍了如何建立Java开发环境并对JDK开发环境中的常用工具做了简要说明,最后,通过经典的HelloWorld程序讲述开发Java应用程序的基本流程。通过本章的学习,读者将对Java语言有一个概括性的认识,理解什么是面向对象编程,并能在自己的机器上建立Java开发环境,编写简单的HelloWorld程序。 ● Java语言的特点 ● Java语言的基本元素 ● 面向对象编程 ● 建立Java开发环境 ● JDK常用工具 ● 编译并执行HelloWorld程序 1.1 Java语言简介 计算机所使用的是由“0”和“1”组成的二进制数,对计算机的每一种操作,都是使用一个唯一的二进制组合进行定义,该二进制组合称为操作码,也称为机器语言,它们是计算机能够识别和执行的实际语言。 遗憾的是,人类直接处理机器语言比较困难。为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,这种程序设计语言就是汇编语言。 由于汇编语言程序依赖于计算机硬件,其可读性和可移植性都很差;所以后来又出现了很多高级语言。当今常用的高级计算机语言主要有:Ada、Basic、C、C++、COBOL、Fortran、Java和Pascal。其中Java是最新的一种语言,它吸收了前面几种语言的精华,并加入了最新的软件工程思想。 1.1.1 Java发展史 Java来自于Sun公司的一个叫Green的项目,其最初的目的是为家用消费电子产品开发一个分布式代码系统,这样我们可以把E-mail发给电冰箱、电视机等家用电器,对它们进行控制,和它们进行信息交流。开始的时候研究人员准备采用C++,但C++太复杂、安全性差,1991年,Sun公司的Jame Gosling、Bill Joe等人开发了一种新的语言Oak(Java的前身),Oak是一种用于网络的精巧而安全的语言,Sun公司曾依此投标一个交互式电视项目,但结果被SGI打败了。可怜的Oak几乎无家可归,恰巧这时Mark Ardreesen开发的Mosaic和Netscape启发了Oak项目组成员,他们用Java编制了HotJava浏览器,得到了Sun公司首席执行官Scott McNealy的支持,从而触发了Java进军Internet。 关于Java的命名也有一则趣闻,有一天,几位Java成员组的会员正在讨论给这个新的语言取什么名字,当时他们正在咖啡馆喝着Java(爪哇)咖啡,有一个人灵机一动说就叫Java并得到了其他人的赞赏,于是,Java这个名字就这样传开了。 1.1.2 Java语言的特点 Java是一种基于C和C++语法的纯面向对象的编程语言,但消除了C和C++语法中大多数易混淆的特征。根据Sun公司的“Java白皮书”中对Java的定义,Java是一种简单、面向对象、分布式、解释性、健壮、安全、结构中立、可移植、高性能、多线程和动态的语言,具有如下特点: ● 简单性:Java语言是一种面向对象的语言,类似于C++,因此,C++程序员可以很快就掌握Java编程技术。Java摒弃了C++中容易引发程序错误的地方,如指针和内存管理。Java提供了丰富的类库,使得编程比较容易。 ● 面向对象:Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型,是一种纯面向对象的编程语言。 ● 分布式:Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。因此,Java应用程序可凭借URL打开并访问网络上的对象,其访问方式与访问本地文件系统几乎完全相同。为分布环境尤其是Internet提供动态内容无疑是一项非常宏伟的任务,但Java的语法特性却使我们很容易地实现这项目标。 ● 解释性:Java解释器(运行系统)能直接运行目标代码指令。链接程序通常比编译程序所需资源少,所以程序员可以在创建源程序上花上更多的时间。 ● 健壮性:通过集成的面向对象的例外处理机制,在编译时,Java会提示出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。 ● 安全性:Java的安全性可以从两个方面得到保证。一方面Java语言不支持指针和释放内存等C++的功能,这样就避免了非法内存操作;另一方面,类装载通过将本机类与网络资源类的名称分开来保持安全性。 ● 多线程:Java提供多线程功能使得在一个程序里可同时执行多个小任务,而且同步机制保证了对共享数据的正确操作。通过使用多线程可以很容易的实现网络上的实时交互行为。 ● 动态性:Java的动态特性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类,这是C++语言进行面向对象程序设计所无法实现的。而且Java通过接口来支持多继承,使之比严格的类继承具有更灵活的方式和扩展性。 ● 结构中立:为了让Java与网络融为一个整体,Java将它的程序编译成一种结构中立的中间文件格式,只要有Java运行系统的机器都能执行这种中间代码。 ● 可移植性:与平台无关的特性使得Java应用程序可以方便的移植到网络上的不同机器。同时Java类库中也实现了与不同平台的接口,使得这些类库可以移植。这种“编写一次,任何地方均可使用”的哲学意味着一个组织不会被一种特定类型的计算机硬件所锁定。 ● 高性能:如果解释器速度不慢,Java可以在运行时直接将目标代码翻译成机器指令,从而得到较高的性能。 当然Java也有一些不足之处。其中之一是它缺乏其他语言所具有的一些重要特征。例如,Fortran、C和C++等语言具有简单的输出语句,允许程序员以一种特定的格式显示数值数据,并容易制定小数点后数字的长度和个数,从而产生输出数据表,这在许多工程和科学应用中非常重要,而在标准Java语言中则不包含此功能。 另外,Java的运行速度相对较慢。当每次使用编译后的Java程序时,它是被一个实时(JIT)编译器解释或编译执行。因此Java应用程序的执行速度比本机语言(如C++)程序要慢得多。 1.1.3 Java的基本元素 Java由3种独立的基本元素组成:Java编程语言,Java运行时环境,Java应用编程接口(API)。 Java与其他计算机语言不同的是,所有的Java程序都在一种特定类型的计算机上编译执行,称为Java虚拟机(Java VM)。Java VM是一种具有特定机器语言(字节码)的计算机。之所以称为“虚拟”,是因为这种计算机实际上是不存在的,它是由一种称为Java运行环境(JRE)的特定程序模拟的。人们已经开发了一个版本的JRE,该JRE适合于每一台计算机和众多的操作系统(如Windows、Sun Solaris、Linux、Macintosh等)。所有的Java编译器都产生字节码,字节码能够直接在任何Java VM上运行而不管该计算机是什么类型的,这使得Java程序真正做到“编写一次,任何地方均可使用”。 Java运行环境包含了在一台给定计算机上运行Java的所有必要支持。当Java程序运行时,JRE装载并验证字节码以确保程序的有效性,然后运行一个称为Java解释器(也可能是一个实时编译器)的特定程序,将Java VM字节码转换为特定计算机能够识别的机器语言。对于一种给定类型的计算机,只要编写了针对该计算机的Java解释器,该计算机就能够运行任何Java程序。 编译和执行Java程序的过程如图1-1所示。可以使用任何文本编辑器编辑Java程序并存储为一个磁盘文件,文件的扩展名为“.java”(例如,MyProg.java)。Java编译器将这个程序编译为能够在Java VM上执行的字节码,并将字节码存储为一个文件,文件的扩展名为“.class”(本例中是MyProg.class)。当程序在计算机上执行时,Java解释器实时地将Java VM字节码转换为计算机能够执行的指令。编译过程仅执行一次,解释过程在每次运行Java程序时都要执行。Java字节码独立于任何特定的计算机硬件,因此任何具有Java解释器的计算机都能够执行编译过的Java程序而不管程序编译时的计算机是什么类型。 图1-1 Java程序编译和执行过程 Java应用编程接口是一个非常大的软件组件集合,这些组件提供了读写文件、操作字符串、绘图以及其他许多必要的功能。Java API中相关的组件被组合成库(或称为包)。通过使用这些标准包中的对象,程序员能够节省大量的时间。所有的Java实现都支持这些包中的组件,因此使用组件的程序能够在任何支持Java的计算机系统中正确运行。另外,组件是经过调试的,因此使用组件将减少编写和调试程序的工作量。 1.2 面向对象编程 Java是面向对象的编程语言,因此要理解Java语言的编程技术就必须了解面向对象的编程技术。 1.2.1 面向过程与面向对象 编程的主要目的是为了实现现实世界的某些功能,因此,传统的高级程序语言,如Basic、C、Pascal等,很容易采用面向过程的编程方法。面向过程的程序设计方法从解决问题的每一个步骤入手,适合解决比较小的简单问题。当编写比较大的应用程序时,使用面向过程的编程方法设计就会变得很困难,这主要是因为面向过程的处理模型是数据驱动的,与现实世界模型具有不一致性。在现实世界模型中,对象是基本的组成单元,对象具有状态和行为,这两者紧密相关,面向过程的编程方法就是将两者分开处理,而不考虑这两者的相互关系。 面向对象的程序设计就是按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过消息传递来完成一定的任务。面向对象的程序设计主要有事物抽象、封装、继承和多态等特点,进而对应面向对象的基本概念:对象(Object)、类(Class)、方法(Method)和实例(Instance)等。 1.2.2 客观事物的抽象 现实世界的对象都有两个相同的特征—— 状态和行为。例如,汽车有状态(颜色、品牌、排量)和行为(加速、刹车、换档),狗也有状态(名字、颜色、种类)和行为(叫、走、吃)等。为了使计算机能够处理和理解客观事物,程序开发人员必须对事物进行抽象,以求得事物的本质。 利用面向对象的编程语言设计对象时,使用属性来包含状态,使用方法来实现对象的行为,因此如果我们对汽车进行抽象将得到如图1-2所示的关系图。 图1-2 对汽车进行抽象 1.2.3 对象和封装 在对客观事物进行抽象之后,就可以用抽象出来的数据模型来描述对象。因此,对象就是把数据和相关的操作封装在一起而构成的实体。对象中的数据称为数据成员或属性,对象中的一些函数称为方法或成员函数。方法的调用是通过消息的发送和传递实现的。 封装是将相关的数据及其操作结合在一起,使其结构严谨,屏蔽交叉,并使除该对象方法以外的其他方法不能使用这些数据、改变这些数据的状态。封装也称为消息隐藏。 封装允许对象拥有完全独立的数据和代码,这样人们在使用对象时,不需要考虑对象的具体实现,而只需考虑各个对象的接口。因此,每个对象可以看成一个“黑匣子”,消息从“黑匣子”的一端进入,从另一端出来,如图1-3所示。 图1-3 封装的对象 这样,编程人员在设计应用程序时,通过对象的接口将不同对象联系起来就可以组成自己所需的应用系统,当某个对象的内容结构或实现方法改变时,只要对象的接口没有改变,就不用改变程序,从而使得整个系统便于升级和维护。 1.2.4 类和继承 在面向对象的程序设计中,将数据抽象和对数据的操作结合在一起的完整定义就是类(Class)。类是基于对象的基本概念,在本质上类属于对象的描述,是创建对象的模板。每个对象都由相应的类来实现,对象的创建是通过类的实例化来实现的,创建的对象称为类的一个实例(Instance)。每一个Java程序都包含一个或多个类,程序中的主要类必须至少包含一个方法。 在类的创建过程中,新的类可以通过在原有类的基础上增加新的成员变量和成员方法来创建,这种创建方式称为继承。被继承的类称为父类(SuperClass),创建的新类称为子类(SubClass),继承关系如图1-4所示。 图1-4 类的继承 继承可以最大限度地重复使用代码,从而大大提高编码效率。 1.3 建立Java开发环境 1998年12月8日,Sun公司正式发布Java Software Development Kit(简称 Java2 SDK),之后推出JDk1.2、1.3、1.4等,目前最新的版本是JDK6 Update 3(JDK1.6)。 1.3.1 下载并安装JDK 6 JDK 6是Sun公司免费提供的Java开发工具包的最新版本。使用此工具可以开发Java应用程序和小应用程序等。 我们可以在Sun公司的主页上下载此开发工具,下面以下载JDK Update3为例,介绍下载并安装JDK的具体步骤: (1) 打开IE或者其他浏览器,在地址栏中输入下列网址http://java.sun.com/,进入Sun公司,如图1-5所示。 图1-5 Sun公司网站 (2) 在右侧Popular Downloads区域中选择Java SE进入下载页面,如图1-6所示。 图1-6 下载页面 (3) 选择要支持的操作系统和语言然后点击下载。 下载完成后即可进行安装。虽然Java是跨平台的,但在各种平台下的安装方式却各不相同。这里主要介绍目前比较流行的Windows操作系统的安装过程。 在硬盘上找到刚下载好的jdk-6u3-windows-i586-p.exe安装文件,双击这个文件启动安装过程,按照提示我们可以很快的完成JDK1.6的安装。 1.3.2 设置系统环境变量 安装好JDK6以后,还需要设置系统的环境变量。假设JDK1.6安装在C:\ Program Files\Java\jdk1.6.0_03目录下,下面以Windows XP为例介绍如何设置系统环境变量。 (1) JDK1.6安装成功之后,在桌面上右击“我的电脑”图标,从弹出的快捷菜单中选择“属性”命令,打开“系统属性”对话框,选择“高级”选项卡,如图1-7所示。 (2) 单击“环境变量”按钮,打开“环境变量”对话框,如图1-8所示。在“系统变量”区域中需要设置3个变量的值。 图1-7 “系统属性”对话框 图1-8 “环境变量”对话框 (3) 单击“新建”按钮,打开“新建系统变量”对话框,在变量名文本框中输入“JAVA_HOME”,顾名思义就是java的安装路径,然后在“变量值”文本框中输入JDK的安装路径“C:\Program Files\Java\jdk1.6.0_03”,如图1-9所示。 (4) 用同样的方法新建变量名为classpath,变量值为“.;%JAVA_HOME%\lib; %JAVA_HONE%\lib\tools.jar”的系统变量。该变量的含义是Java加载类库(bin或者lib)的路径,这里的“%JAVA_HOME%”表示刚才设置的系统变量JAVA_HOME的值。 (5) 在系统变量里找到Path变量,单击“编辑”按钮,打开“编辑系统变量”对话框,如图1-10所示。修改该变量的变量值,在原变量值前添加“%JAVA_HOME%\bin; %JAVA_HOME%\jre\bin;”。 图1-9 新建JAVA_HOME变量 图1-10 修改Path变量 (6) 验证是否安装成功。打开一个命令行窗口,输入“java -version”命令,按Enter键,如果安装成功,则系统显示当前Java的版本信息“java version "1.6.0_03"”。 到此为止,Java环境我们已经配置好了,你已经可以在自己的机器上编译并运行Java程序了。也许读者会问,到底怎么样运行呢?下一节我们将对Java开发工具做详细的介绍。 1.4 JDK开发环境工具简介 在上一节中我们已经安装好了JDK6,本节我们来学习如何使用它。转到JDK6安装目录的bin子目录下,我们可以看到很多.exe文件,这些都是JDK自带的工具,本节将对其中比较常用和重要的几个作简单介绍,其他工具的使用方法读者可参考相应的帮助文件。 1.4.1 Java编译器(javac.exe) Java编译器本身是用Java编写的一个应用程序,它是由Sun公司的技术人员Arthur Van Hoff编写完成的,其作用是将Java源代码(.java文件)转换成字节码(.class文件)。 Java编译器一次可以编译多个源程序,输入结构为类文件。对于源程序中的每个类的定义,它都会生成一个单独的类文件。例如:如果Welcome.java中定义了Welcome、Welcome1和Welcome2,3个类编译后将生产3个类文件:Welcome.class、Welcome1.class和Welcome2.class。 Java编译器的调用格式如下: Javac [options] file.java 其中可选项options可定义为表1-1中所示的常见选项。 表1-1 javac可选参数选项 参 数 名 描 述 -classpath 此选项用于设定路径,该路径用于查找需调用的类,路径是一个用分号分开的目录列表 -d 指定一个根目录,创建反映软件包继承关系的目录树 -g 为调试器生成附加信息 -ng 不显示附加信息 -nowarn 不显示警告性错误 -o 优化由内联的static、final以及private成员函数所产生的代码,生成的类文件不包含行号 -verbose 显示编译的详细过程 下面举例说明上表所列选项的使用。 ● -classpath 例:C:\src> Javac –classpath C:\My Java\lib;C:\Home Welcome.java ● -d 例:C:\src> Javac –d C:\classes Welcome.java ● 其他 其他选项均直接使用 例:C:\src> Javac –g Welcome.java C:\src> Javac –verbose Welcome.java 1.4.2 Java解释器(java.exe) Java解释器可以直接从类文件执行Java应用程序,其调用格式如下: Java [options] classname [arguments] 这里的classname表示要执行的程序,类名可以为不带任何类库前缀修饰的类名,如:Welcome不需要带.class后缀。但是,如果要运行的类被归属到某个类库则必须加上完整的类库修饰。类库之间以及类库和类之间用点(.)隔开,例:C:\src>java myjava.Welcome表示执行C:\src\myjava目录下的Weolcome.class文件。 在调用Java解释器时,只需指定一个类文件名称即可,解释器将自动装载程序中用到的其他类文件。 其中可选项options可以是如表1-2所示的常见选项。 表1-2 java可选参数选项 参 数 名 描 述 -classpath 如何查找用户自定义的类文件的位置 -D 此选项允许用户在运行时改变属性值 -verify 使用校验 -help 打印本命令的使用帮助 可选项arguments是输入的参数。 1.4.3 Applet浏览器(AppletViewer.exe) 使用appletviewer命令可以运行Java的小应用程序。Appletviewer读取包含小应用程序的HTML文件并在一个独立的窗口中运行,其命令行格式如下: appletviewer [options] htmlfilename 其中可选项options可以是如表1-3所示的常见选项。 表1-3 appletviewer可选参数选项 参 数 名 描 述 -debug 在 Java 调试器中启动Applet小程序查看器 -encoding 指定由 HTML 文件使用的字符编码 -J 向 Java 解释器传递参数 如果设置了debug参数,Java小程序浏览器将从Jdb内部启动,这样,就可以用这个Java调试器调试HTML文件中所引用的Applet了。 1.4.4 API文件产生器(javadoc.exe) Javadoc.exe程序用于读取一个Java类文件并自动创建一组HTML文件,这些HTML文件描述了Java类文件的类、变量和成员函数,所有Java类库的API文件都可以由此程序创建。Javadoc把软件包名或源文件列表当做一个变量。Javadoc依靠以@打头的备注标记来创建HTML文件,表1-4给出了Javadoc能够识别的标注,它们被Javadoc用于在HTML文件中创建链接。 表1-4 Javadoc标记 选 项 功 能 @see classname 此标注在类列表中增加一个到所提供类的See Also条目 @see classname # methodname 此标注创建一个到特定的成员函数的See Also条目 @version text 此标注在HTML文件中加入一个版本信息条目 @author text 此标注在HTML文件中加入一个作者信息条目 @param name description 此标注用成员函数备注来描述一个成员函数所带变量 @return description 此标注用成员函数备注来描述返回值 @exception classname 此标注用成员函数备注 1.4.5 文件归档工具(jar.exe) Java 程序是由若干个.class文件组成的,这些.class文件必须根据它们所属的包的不同而分级分目录存放;运行前需要把所有用到的包的根目录指定给CLASSPATH环境变量或者 java命令的-cp参数;运行时还要到控制台下去使用java命令来运行,如果需要直接双击运行必须写Windows的批处理文件(.bat)或者Linux的Shell程序。因此,许多人说,Java 是一种方便开发者苦了用户的程序设计语言。 其实,如果开发者能够制作一个可执行的JAR文件包交给用户,那么用户使用起来就方便了。在 Windows 下安装 JRE (Java Runtime Environment) 的时候,安装文件会将.jar文件映射给javaw.exe 打开。那么,对于一个可执行的JAR文件包,用户只需要双击它就可以运行程序了,就像阅读.chm文档一样方便。 JAR文件就是Java Archive File,顾名思义,它的应用是与Java息息相关的,是Java的一种文档格式。JAR文件非常类似于ZIP文件—— 准确地说,它就是ZIP文件,所以又被称为文件包。JAR文件与ZIP文件唯一的区别就是在JAR文件的内容中包含一个 META-INF/MANIFEST.MF文件,这个文件是在生成JAR文件的时候自动创建的。 JDK提供了专门用于创建和解压JAR文件包的工具jar.exe,其命令行格式如下: jar {ctxui}[vfm0Me] [jar-文件] [manifest-文件] [入口点] [-C 目录] 文件名 ... 其中{ctxui}是jar命令的子命令,jar命令每次只能包含 ctxui 中的一个;[vfm0Me] 中的选项可以任选,也可以不选,它们是jar命令的选项参数;[jar-文件],即需要生成、查看、更新或者解开的JAR文件包,它是-f参数的附属参数;[manifest-文件],即MANIFEST清单文件,它是-m参数的附属参数;[入口点],指定应用程序的入口点,它是-e参数的附属参数;[-C 目录],表示转到指定目录下去执行这个jar命令的操作,它相当于先使用cd命令转到该目录下再执行不带-C参数的jar命令,它只能在创建和更新JAR文件包的时候可用;“文件名...”指定一个文件/目录列表,这些文件/目录就是要添加到JAR文件包中的文件/目录。如果指定了目录,那么jar命令打包的时候会自动把该目录中的所有文件和子目录都打入包中。 各参数的具体含义如表1-5所示。 表1-5 jar参数的含义 选项 功 能 选项 功 能 -c 创建新的JAR文件包 -t 列出JAR文件包的内容列表 -x 展开JAR文件包的指定文件或者所有 文件 -u 更新已存在的JAR文件包 -i 为指定的JAR文件产生索引信息 -v 生成详细输出到标准输出上 -f 指定JAR文件名,这个参数是必须的 -m 指定需要包含的MANIFEST清单文件 -0 只存储,未用ZIP压缩格式 -M 不产生所有项的清单(manifest〕文件,此参数会忽略-m参数 -e 为捆绑到可执行JAR文件的独立应用程序,指定应用程序入口点 -C 改变到指定的目录,并且包含下列文件,只在创建或者更新包的时候可用 说明:清单文件名、归档文件名和入口点名的指定顺序与“-m”、“-f”和“-e”标志的指定顺序要相同。 下面举一些例子来说明 jar 命令的用法: (1) jar cf test.jar test 该命令不显示执行的过程,执行结果是在当前目录生成test.jar文件。如果当前目录已经存在test.jar,那么该文件将被覆盖。 (2) jar cvf test.jar test 该命令与上例中的结果相同,但是由于使用了v参数,所以会显示打包过程信息。 (3) jar cvfM test.jar test 该命令与(2)结果类似,但在生成的test.jar中不包含META-INF/MANIFEST文件。 (4) jar cvfm test.jar manifest.mf test 运行结果与(2)相似,显示信息也相同,只是生成的JAR包中的 META-INF/MANIFEST 内容不同,包含了manifest.mf的内容。 (5) jar tf test.jar 在test.jar已经存在的情况下,可以查看test.jar中的内容。 (6) jar xf test.jar 解开test.jar到当前目录,不显示任何信息。 (7) jar xvf test.jar 运行结果与(6)相同,只是对于解压过程有详细信息显示。 接下来,再介绍一些关于JAR文件包的技巧。 ● 使用unzip解压JAR文件 在介绍JAR文件的时候我们就已经提到过了,JAR文件实际上就是ZIP文件,所以可以使用解压ZIP文件的工具来解压JAR文件,如Windows下的WinZip、WinRAR等。 ● 使用WinZip或者WinRAR等工具创建JAR文件 因为JAR文件就是包含了META-INF/MANIFEST的ZIP文件,所以,只需要使用 WinZip、WinRAR等工具创建所需要的ZIP压缩包,再往这个ZIP压缩包中添加一个包含 MANIFEST文件的META-INF目录即可。对于使用jar命令的-m参数指定清单文件的情况,只需要将这个MANIFEST按需要修改即可。 ● 使用jar命令创建ZIP文件 在没有其他创建ZIP文件的工具时,可以使用带-M参数的jar命令,因为-M参数表示制作JAR包的时候不添加MANIFEST清单,所以只需要将目标JAR文件的.jar扩展名改为.zip扩展名,创建的就是一个ZIP文件了。 1.4.6 头文件生成器(javah.exe) javah.exe用于创建C头文件和存根文件,这些是把本地C成员函数包入java所需要的。被创建的头文件给出了有关java类的信息,这些信息是C成员函数与java类交换数据所必需的。存根文件将用来创建将定义java对象的结构与java对象本身数据相联系的C文件。javah的命令行格式如下: javah [options] classname javah程序有些像java解释器,它只需要类名而不需要写.class扩展名。javah 程序可接受多个类名以产生文件头和存根文件,表1-6列出了javah程序命令行选项的含义。 表1-6 javah参数选项 选 项 功 能 -o outputfile 将产生的所有文件头或存根文件都放到一个单独的文件outputfile中 -d directory 把产生的文件头或存根文件放入给定目录 -jni 生成 JNI样式的头文件 -verbose 将产生文件的状态输出到标准输出设备 -classpath path 用path目录寻找类文件,多个目录之间用分号分开 -bootclasspath path 用于装入引导类的路径 1.4.7 反汇编器(javap.exe) javap命令用于反编译一个java字节代码文件,返回有关可变部分和成员函数的信息,其命令行格式如下: javap [options] classname additionalClasses javap的标准输出是公有变量和类的成员函数。javap的命令行选项如表1-7所示。 表1-7 javap选项及其含义 选 项 功 能 -public 只输出公有的成员函数和变量 -private 输出所有成员函数和变量,包括私有和公有的 -protected 输出公有和受保护的成员函数和变量 -c 为各成员函数输出已编译过的字节代码 -classpath path 在路径path中寻找Java类 -l 输出行号 1.4.8 密钥管理工具(Keytool.exe) Keytool是安全密钥与证书的管理工具,它管理一个存储了私有钥匙和验证相应公共密钥的与它们相关联的X.509证书链的keystore(密钥库)。 Keytool是一个有效的安全钥匙和证书的管理工具,它能够使用户使用数字签名来管理自己的公/私钥对,管理用来作签名的证书,管理数据完整性和鉴定服务,它还能在通信时缓存公共密钥。 数字证书是某一实体(个人、公司等)的数字身份标识,Keytool把密钥和证书储存到一个keystore.文件中,而另外的一个工具jarsigner用keystore中的信息产生或检验JAR文件中的数字签名。 Keystore有两个不同的入口: ● 密钥入口:保存了非常敏感的加密的密钥信息,并且用一种对称加密算法加密保存以防止未被授权的访问,以这种形式存储的密钥称为秘密密钥,或私有密钥。 ● 信任证书入口:包含一个属于其他部分的单一公共密钥证书,它之所以被称为“信任证书”是因为keystore信任的证书中的公共密钥真正属于证书所有者的身份识别。 在java.security包中有个Keystore类,该类提供一个非常好的接口去获取和修改keystore中的信息,由于keystore是公开的,所以用户可以用它写一些额外的安全应用程序。Keystore中还有一个Sun公司提供的內在实现,它把keystore作为一个文件来实现(后缀名为.jks),它用单独的密码保护每一个私有密钥。 关于Keytool工具的使用不是本书的重点,下面给出几个简单的应用实例: ● 产生一个keystore keytool -genkey -alias mystore(keystore的别名) -keyalg RSA -validity 7 -keystore keystore(指定keystore) 在命令行执行上述命令,系统会提示用户输入一些信息,根据提示依次输入即可创建一个别名为mystore的keystore。 ● 查看keystore的内容 keytool -list -v -keystore keystore 执行该命令,按提示输入keystore的密码即可显示keystore的內容。 ● 将keystore导入到一个文件 keytool -export -alias mystore -keystore keystore -rfc -file testkey 执行该命令,将把别名为mystore的keystore导入到文件testkey。 ● 导入证书到一个新的truststore keytool -import -alias cacert -file ca.crt -keystore truststore 执行该命令将把证书ca.crt导入到truststore 1.4.9 转码工具(native2ascii.exe) native2ascii.exe用于将文本类文件(如*.txt、*.ini、*.properties、*.java等)编码转为Unicode编码。Unicode是一种在计算机上使用的字符编码,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到了普及。 native2ascii的命令行格式如下: native2ascii [-options] [inputfile [outputfile]] 其中,[-options]表示命令开关,有两个选项可供选择。 ● -reverse:将Unicode编码转为本地或者指定编码,不指定编码的情况下将转为本地编码。 ● -encoding encoding_name:转换为指定编码,encoding_name为编码名称。 [inputfile [outputfile]]用于指定输入和输出文件。 ● inputfile:表示输入文件全名。 ● outputfile:输出文件名。如果缺少此参数,转换结果将输出到控制台。 下面看几个具体的转码实例。 (1) 将中文转换为Unicode编码 新建文本文件a.txt,文件内容为:“清华大学出版社”,在命令行执行如下命令: native2ascii a.txt b.txt 打开b.txt,可以看到其内容为“\u6e05\u534e\u5927\u5b66\u51fa\u7248\u793e”。 如果要将转换后的编码输出到控制台,可使用下面的命令: native2ascii a.txt (2) 将中文转换为ISO8859-1编码 要转换为ISO8859-1编码,需要使用-encoding选项,命令如下: native2ascii -encoding ISO8859-1 a.txt c.txt 打开c.txt文件,可以看到其内容为“\u00c7\u00e5\u00bb\u00aa\u00b4\u00f3\u00d1 \u00a7\u00b3\u00f6\u00b0\u00e6\u00c9\u00e7”。 (3) 将纯字母数字的文本转码 新建另一个文本文件number.txt,内容为“123abc”,看看纯字母数字的编码如何转换。 native2ascii number.txt unumber.txt 打开unumber.txt文件,可以看到其内容仍为“123abc”。 继续测试将其转为ISO8859-1编码,命令如下: native2ascii -encoding ISO8859-1 number.txt i.txt 打开i.txt,可以看到,其编码仍然为“123abc”。 (4) 将Unicode编码转换为本地编码 将刚才转换得到的b.txt文件中的内容转换为本地编码,命令如下: native2ascii -reverse b.txt a1.txt 打开a1.txt文件,可以看到其内容为“清华大学出版社”。 1.5 编译执行第一个Java程序 Java程序主要分为两类:Java小程序(Applet)和Java应用程序(application),Application更像以VB、VC等编写的桌面程序,多以控制台方式运行,当然也很容易实现窗口应用;Java Applet则要嵌入HTML页面中,作为页面的组成部分被下载,并能运行在实现Java虚拟机的Web浏览器中。另外,Java Applet没有main()方法,而Application一定要有main()方法。 下面我们以经典的HelloWorld程序来介绍如何编写Java程序。 1.5.1 Java应用程序 Java源程序的编写可以采用多种文本编辑器,最简单的如Windows的记事本、UltraEdit等,下面我们就开始编写第一个Java应用程序HelloWorld,该程序的功能是在屏幕上输出“Hello World!”,代码如例程1-1所示。 例程1-1 //HelloWorld.java public class HelloWorld{ // main method begins execution of Java application public static void main( String args[] ){ System.out.println( "Hello World!" ); } // end method main } //end class HelloWorld 一个Java源文件可以包含多个类,但是整个文件最多只有一个类为public,且这个public的类的名称必须和文件名一致。本例中类HelloWorld设为public(public class HelloWorld),calss是关键字,public是修饰符,表示公有类;紧接着的是main()方法,这是Java应用程序的入口点,与C/C++是一样的。Main方法中只有一条语句System.out.println( "Hello World!" );,该语句用来向屏幕输出一字符串:“Hello World!” 打开命令行窗口,进入HelloWorld.java文件所在的目录,然后用下面命令编译程序: javac HelloWorld.java 编译后,将在当前目录下生成一个字节码文件HelloWorld.class,用下面的命令就可以运行这个Java应用程序了: java HelloWorld 这时,屏幕上将显示字符串“Hello World!”,如图1-11所示。 图1-11 编译并运行HelloWorld应用程序 1.5.2 Java Applet 现在我们把上节中的HelloWorld应用程序编写为一个同样功能的Applet,文件名取为HelloWorldApplet.java,其代码如例程1-2所示。 例程1-2 //HelloWorldApplet.java import java.applet.*; import java.awt.*; public class HelloWorldApplet extends Applet{ public void paint(Graphics g ){ g.drawString("Hello World!",10,50); } } //end class HelloWorldApplet 程序中的import关键字和C/C++中的#include语句功能一样,其作用是使用JDK提供的系统类库,其中*号代表包中的所有类。 与Java应用程序相比,Applet中类的声明有所不同,其中extends Applet是所有Applet必须有的,表示该类由Applet派生而来,具有Applet的所有功能。 Applet的编译过程跟编译Java应用程序相同,也是使用javac命令生成HelloWorldApplet.class文件,但Applet的运行与应用程序不同,Applet要运行在浏览器中,所以我们还需要创建一个HTML文件,然后可以直接用浏览器(IE或Netscape)或者使用appletviewer来运行这个HTML文件。 例程1-3所示是applet.html文件的代码,在该HTML文件中嵌入了前面编译产生的HelolWorldApple.class。 例程1-3 //applet.html HelloWorld Applet 在命令行使用appletviewer来运行。 appletviewer applet.html 运行结果如图1-12所示。 图1-12 用appletviewer运行applet的结果 1.6 本 章 小 结 本章讲述了Java语言的发展史、Java语言的特点、Java的基本元素和面向对象编程思想,使读者对Java有了初步的认识;接着我们讲述了Java开发环境的创建,本书采用的是Sun公司网站上提供的最新版本JDK6 update3;最后介绍了JDK中的常用工具并在该环境下编译执行了第一个Java程序—— HelloWorld。通过本章的学习,读者对Java语言和面向对象编程有了一个概括性的认识,进一步激发了学习Java的兴趣。从下一章开始我们将学习Java语言的语法和编程技巧。 1.7 思考和练习 1. 请说出Java语言的特点。 2. Java语言的基本元素包括哪些? 3. 什么是对象?什么是类? 4. 如何编译并执行Java应用程序? 5. 什么是Applet?Applet程序与Java应用程序有哪些不同? ?? ?? ?? ?? Java程序设计实用教程 第1章 Java基础知识 16 15