《第02章 Java编程环境.pdf》由会员分享,可在线阅读,更多相关《第02章 Java编程环境.pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 2 章 Java 编程环境 教学目标:本章重点在于 Java 虚拟机的概念和 J2SDK 的使用。本章首先介绍了 Java的运行环境和开发环境,然后详细介绍了 Sun 公司的 J2SDK 开发工具,并且给出了两个 Java 程序的源代码以及编译、运行过程,以加深读者对 Java 语言程序开发的直观认识,最后本章介绍了 J2SDK 工具包提供的程序调试器。教学重点与难点:Java 虚拟机和 Java 运行时环境 J2SDK 开发工具 Java 的 Application 和 Applet Java 语言的调试器 2.1 Java 运行环境和开发环境 正如前文所言,Java 语言是先编译后解释
2、的。Java 源程序首先被编译成字节码文件,然后由 Java 解释程序解释性地执行。这个 Java 解释程序即 Java 虚拟机,Java 虚拟机在各种常用的操作系统这都已经安装。Java 虚拟机是一个虚拟机器,在实际的计算机上通过软件模拟来实现。Java 虚拟机有自己虚拟的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 语言一个非常重要的特点就是与平台的无关性,而使用 Java 虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入 Java 虚拟机后,Java 语言在不同平台上运行并不需要重新编译。Java 语言使用 Jav
3、a虚拟机屏蔽了与具体平台相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。Java 虚拟机是 Java 语言底层实现的基础,对 Java 语言感兴趣的人都应对 Java 虚拟机有个大概的了解。Java 最基本的开发工具是 Sun 公司发布的 Java 开发工具 Java2SDK。Java2SDK 是免费软件,可以通过 http:/ 网站或其它网站取得 J2Sdk。另外还有一些其他公司也实现了 Java 的开发工具如 IBM 的 JDK 等。大型
4、的集成开发环境软件有 Borland JBuilder等,这些软件提供了完整的 Java 开发环境和可视化的开发手段。Java 源程序可以用任何文本编辑器来编写。然后用 Java2SDK 的 javac 编译生成扩展名为 class 的字节码文件。用 java 程序运行它。对于初学者,最好不要使用 Jbuilder 等集成开发环境,因为这些工具一方面提供了部分代码自动产生的功能,另一方面它门屏蔽了 Java程序的编译等过程,这对于初学者对 Java 语言的熟悉了理解是不利的,所以建议初学者使用一般的编辑器和 Sun 的 Java2SDK 进行 Java 的入门学习。有一些名词在很多地方经常遇到
5、,这里有必要简单说明一下:JDK:Sun 早期的 Java 开发工具包叫做 JDK(Java Development Kit)。JRE:即 Java 运行环境 JRE(Java Runtime Environment)。Sun 的 Java 网站上就提供Java2SDK 和 JRE 各种版本的下载。Java2SDK 是用于开发 Java 程序所用,而应用程序的最终用户是不需要开发工具的,但是他们需要 Java 的运行时环境。JRE 就是 Java 程序要运行所需要的环境。2.2 开发环境的安装和使用 学习 Java 语言前,必须安装一套 Java 语言的开发平台。Sun 公司的 Java2SD
6、K 是人们最常使用的 Java 语言开发工具。本小节将介绍对 Java2SDK 开发工具的安装和使用进行详细的说明。2.2.1 Java2SDK 简介 Sun 免费提供开发工具 Java2SDK,官方提供 Windows、Java Desktop System(linux)、Solaris Sparc 三种版本,IBM 的 AIX、HP 的 HP-UX、MacOS X、FreeBSD 等,都有兼容于标准 Java2SDK 的 java 2 SDK。Java2SDK 主要包括以下工具:javac:Java 语言编译器,输出结果为 Java 字节码。java:Java 字节码解释器。javap:J
7、ava 字节码分解程序,本程序返回 Java 程序的成员变量及方法等信息。javah:C 代码处理工具,用于从 Java 类调用 C+代码。appletviewer:小应用程序浏览工具,用于测试并运行 Java 小应用程序。Java 解释器是面向 Java 程序的一个独立运行系统,它以一种稳定、高性能方式运行,是独立于平台的 Java 字节码。Java 编译器 javac 则用于生成这些字节码。2.2.2 安装 Java2SDK 下面介绍 Java2SDK 的在 Windows 下的安装和配置过程。最新版本的 Java2SDK 可以在 SUN 公司的 Java 主页 http:/下载。Java
8、2SDK的安装文件是一个可执行文件。运行这个文件,按照安装程序的指导,很容易就能把Java2SDK 安装上。安装完毕之后,需要设置两个环境变量:PATH 和 CLASSPATH。这两个变量在Windows98 和 Windows2000(WindowsXP、Windows2003)下的设置方法不同。为了便于说明,假设 Java2SDK 的安装路径是 D:USRj2sdk1.4.2bin。在 Windows98 下,首先需要编辑 autoexec.bat 文件,在这个文件的最后添加以下两行:set PATH=%PATH%;D:USRj2sdk1.4.2bin;set CLASSPATH=.;D:
9、USRj2sdk1.4.2lib;D:USRj2sdk1.4.2libdt.jar;D:USRj2sdk1.4.2libtools.jar;第 一 行 的 作 用 是 把 D:USRj2sdk1.4.2bin 目 录 加 到 系 统 路 径 下,如 果 装 在E:j2sdk1.4.2bin 目录中则应写成 E:j2sdk1.4.2bin,第二行的作用是设定 Java2SDK 的CLASS 路径。注意进行以上的设置之后,必须运行 autoexec.bat,设置才会生效,Win98 启动时会自动运行这个批处理文件。如果你的操作系统是 Windows2000、WindowsXP 或 Windows2
10、003,则应该按以下步骤进行安装:(1)在桌面上 My Computer(我的电脑)图标上单击鼠标右键。(2)选中 Properties(属性),在属性对话框上选择 Advanced(高级)一项。(3)单击 Environment Variables(环境变量),之后会弹出如图 2-1 所示的对话框。图 2-1 添加环境变量(4)此时环境变量中已经有 path 一项,首先单击选中,然后点击 Edit(编辑)。(5)在弹出的 Edit User Variable(编辑用户变量)对话框中的 Variable Value(变量值)后加入:D:USRj2sdk1.4.2bin 这是跟据 Java2SD
11、K 的安装路径而定的,并确定,如图 2-2 所示。图 2-2 编辑 path 变量(6)在“环境变量”对话框中单击 New(新建)按钮,在弹出的 New User Variable(新建用户变量)对话框的 Variable Name(变量名)一项中填入 CLASSPATH,在“变量值”一项中填入:.;D:USRj2sdk1.4.2lib;D:USRj2sdk1.4.2libdt.jar;D:USRj2sdk1.4.2libtools.jar;如图 2-3 所示:图 2-3 编辑 CLASSPATH 变量(7)单击确定 完成以上的步骤后,现在你可以试试设置是否生效了,例如可以在命令行方式下敲入:
12、echo%CLASSPATH%看看 class 路径是否和想要设置的一样。如果不一样,那么应该重新设置。2.2.3 Java2SDK 的使用 在 Java2SDK 开发工具包中,我们将要经常使用的两个工具是:javac 和 java,javac是 Java 语言的编译器,而 java 则用于运行编译好的字节码。下面分别对它们进行详细的介绍。1.编译器编译器 javac Java 程序的编译程序是 javac.exe。javac 将 Java 程序编译成字节码,然后用 java 解释器来解释执行这些 Java 字节码。Java 程序源代码必须存放在后缀为.java 的文件里。对于Java 程序里
13、的每一个类,javac 都将生成与类名称相同但后缀为.class 的文件。编译器把.class文件放在.java 文件的同一个目录里,除非用了-d 选项。当引用到某些自己定义的类时,必须指明它们的存放目录,这就需要利用环境变量参数 CLASSPATH,CLASSPATH 的设定方法在上一小节已介绍。javac 的使用方法法如下:javac 主要选项含义解释如下。-classpath path 定义 javac 搜索类的路径。它将覆盖默认 CLASSPATH 环境变量的设置。路 径 是 由 一 串 由 逗 号 隔 开 的 路 径 名 组 成,一 般 格 式 如 下:.;。例如:.;C:javad
14、occlasses;C:toolsjavaclasses 表示编译器遇到一个新类,它先在本文件中查找它的定义,如果没有,则在本文件所处目录下其他文件中查找它的定义,如果还没有,则继续搜索 C:javadocclasses 目录中的所有文件,依此类推。-d 指明类层次的根目录,格式如下:javac-d MyProgram.java 这样将 MyProgram.java 程序里的生产的.class 文件存放在 my_dir 目录里。-g 带调试信息编译,调试信息包括行号与使用 Java 调试工具时用到的局部变量信息。如果编译没有加上-O 优化选项,则只包含行号信息。-nowarn 关闭警告信息,编
15、译器将不显示任何警告信息。-O 优化编译 static、final、private 函数,注意类文件可能会变得更大。-verbose 让编译器与解释器显示被编译的源文件名和被加载的类名。2.解释器解释器 java java 是 Java 语言解释器,其作用是对 Java 字节码进行解释。Java 运行如下:java-options class args.或者 java-jar-options jarfile args.描述:java 命令是由 java 编译器 javac 输出的 Java 字节码。classname 参数是要执行的类名称。注意,任意在类名称后的参数都将传递给要执行类的 mai
16、n 函数。java 执行完 main 函数后退出,除非 main 函数创建了一个或多个线程。如果 main 函数创建了其他线程,则 java 总是等到最后一个线程退出才退出。下面是主要选项含义解释:-classpath path 含义同 javac 中-classpath 类似。-verbose 让 java 解释器在每一个类被调入时,将相应信息打印在标准输出。2.3 编辑器选择 工欲善其事,必先利其器。在开始学习 Java 语言之前最好选择一个好的编辑器。好的编辑器能够有效的帮助我们进行代码输入,让我们专著于语言本身的学习。下面介绍两个优秀的编辑器。2.3.1 Ultraedit 编辑器 U
17、ltraEdit 是一套功能强大的文本编辑器,适合于编辑文字、Hex、ASCII 码。Ultraedit可以对 Java、C 等语言的关键字进行高亮显示。可同时编辑多个文件,支持在多个文件中进行查找,支持正则表达式。同时,Ultraedit 可以集成 javac、java 等 Java2SDK 工具,使得 Java 程序的编译、运行都在 Ultraedit 中进行。也就是说,Ultraedit 完全可以配置成一个简单的集成开发环境。Ultraedit 的编辑器的界面如图 2-4 所示。图 2-4 Ultraedit 界面 2.3.2 Emacs 编辑器 Emacs 是 Unix 下一个非常优秀
18、的编辑器,而且已经移植到 Microsoft Windows 平台。事实上,很多人不把 Emacs 仅仅看作一个编辑器,Emacs 所提供的不仅是一个编辑器,它所提供的是一个整合的工作环境,而这个环境是建立在编辑的基石上。一般的软件都是将编辑器视为一个附属功能,只有 Emacs 以编辑器为基石,在其上发展其它的功能。如,Emacs 完成可以配置成一个具有自动代码补全,语法高亮显示,集编辑、编译、运行、查错为一体的集成开发环境。Emacs 通过 lisp 来进行功能扩展,因为 Emacs 拥有大量的用户,Emacs 也有着大量的lisp 功能扩展模块,对 Java 语言而言,所有的一切都是现成的
19、,因此如果熟练掌握了 Emacs,用它来写 Java 程序是非常得心应手的。Emacs 的界面如图 2-5 所示,如果你不喜欢它的颜色,你完全可以自己配置成其他的颜色。图 2-5 Emacs 界面 2.4 Java 程序的结构 在介绍完 Java 语言的开发环境和编辑器的选择后,下面让我们来看看一个 Java 程序是怎么样的,这个程序存放在 HelloWorld.java 文件中。/*HelloWorld 类实现了一个向标准输出显示*字符串Hello,World!的应用程序*/public class HelloWorld static String str=Hello,World!;publ
20、ic static void main(String args)System.out.println(str);/显示 HelloWorld.这个程序用 class 定义的一个 HelloWorld 类,public 指明这是一个公共类,一个 Java程序中可以定义多个类,但最多只能有一个公共类。存放公共类的文件名必须和公共类的名字一致。HelloWorld 中有一个 String 类型的类变量和一个 main()方法,所有的 Java 应用程序(Application)都必须有一个 main()方法,Java 解释器没有生成任何实例时,main()是程序运行的入口。main()方法必须用 p
21、ublic、void、static 来修饰。在 main()方法的实现中,只有一条语句:System.out.println(str);它用来实现字符串的输出,这条语句实现与 C 语言中的 printf 语句和 C+中 coutjavac HelloWorld.java 编译的结果是生成字节码文件 HelloWorld.class。最后用 java 解释器来运行该字节码文件:D:java HelloWorld 这个程序的输入为:Hello,World!下面再来看另外一个例子:import java.awt.*;import java.applet.*;public class HelloWor
22、ldApplet extends Applet public void paint(Graphics g)g.drawString(Hello World!,20,20);这是一个简单的 Applet(小应用程序)。程序中,首先用 import 语句输入 java.awt 和java.applet下所有的包,使得该程序可能使用这些包中所定义的类,它类似于C中的#include语句。然后声明一个公共类 HelloWorldApplet,用 extends 指明它是 Applet 的子类。在类中,我们重写父类 Applet 的 paint()方法,其中参数 g 为 Graphics 类,它表明当前
23、作画的上下文。在 paint()方法中,调用 g 的方法 drawString(),在坐标(20,20)处输出字符串“Hello World!”,其中坐标是用象素点来表示的。这个程序中没有实现 main()方法,这是 Applet 与应用程序 Application 的区别之一。为了运行该程序,首先我们也要把它放在文件 HelloWorldApplet.java 中,然后对它进行编译:D:javac HelloWorldApplet.java 得到字节码文件 HelloWorldApplet.class。由于 Applet 中没有 main()方法作为 Java 解释器的入口,我们必须编写 H
24、TML 文件,把该 Applet 嵌入其中,然后用 appletviewer 来运行,或在支持 Java 的浏览器上运行。它的文件如下:An Applet 其中用标记来启动 HelloWorldApplet,code 指明字节码所在的文件,width 和height 指明 applet 所占的大小,我们把这个 HTML 文件存入 Example.html,然后运行:D:appletviewer Example.html 这时屏幕上弹出一个窗口,其中显示 Hello World!,显示结果如图 2-5 所示。图 2-6 Java 小程序 从上述两个例子中可以看出,Java 程序是由类构成的,对于
25、一个应用程序来说,必须有一个类中定义 main()方法,而对 Applet 来说,它必须作为 Applet 一个子类。在类的定义中,应包含类变量的声明和类中方法的实现。Java 在基本数据类型、运算符、表达式、控制语句等方面与 C、C+基本上是相同的,但它同时也增加了一些新的内容,在以后的各章中会有详细的介绍。本节中的例子只是使大家对 Java 程序有一个初步的了解。2.5 程序调试 Java2SDK 提供了一个名为 jdb 的调试工具,jdb 的命令行选项如下:jdb options class arguments 其中,class 是开始调试的类的名称。arguments 是传给 clas
26、s 的 main()方法的参数。Java 调试程序 jdb 用于调试 Java 类。它利用 Java 调试程序 API 来检查和调试本地或远程 Java 解释器。用 jdb 进行调试有两种方法。最常用的方法是让 jdb 在启动要调试的类的同时启动 Java 解释器。这可以通过在命令行中用命令 jdb 代替 java 来做到。例如,要在 jdb 下启动 AppletViewer,可用下列命令:D:jdb sun.applet.AppletViewer 或:D:jdb-classpath$INSTALL_DIR/classes sun.applet.AppletViewer 采用这种方法启动时,j
27、db 用指定参数来调用另一个 Java 解释器,加载指定的类并在执行该类的第一个指令前先使解释器停止运行。使用 jdb 的第二种方法是将它附接到某个已在运行的 Java 解释器上。出于安全方面的考虑,只有用-Xdebug 选项来启动 Java 解释器,才能对它们进行调试。用-Xdebug 选项启动 Java 解释器时,Java 解释器将输出一口令供 jdb 使用。此外,调试后的解释器决不能用 JIT 编译器来运行。用-Dpiler=NONE 选项来禁止 JIT 编译器的加载。专门的调试程序类必须能为调试后的解释器所使用。这些类不是缺省运行环境类库的组成部分。用-Xbootclasspath;$
28、INSTALL_DIRjrelibrt.jar;$INSTALL_DIRlibtools.jar 选项使调试后的解释器能够定位所有必需的类。总之,启动 Java 解释器的命令如下:D:java-Xdebug-Dpiler=NONE -Xbootclasspath:$INSTALL_DIR/jre/lib/rt.jar:$INSTALL_DIR/lib/tools.jar 要将 jdb 附接到某个正在运行的 Java 解释器上(在知道了会话口令后),按如下命令对它进行调用:D:jdb-host -password 下面列出的是基本的 jdb 命令。Java 调试程序也支持某些其它命令,可用 jd
29、b 的 help 命令列出这些命令。注意:要浏览局部(堆栈)变量,必须先用-g 选项来编译该类。help 或?:最重要的 jdb 命令,help 命令列出可识别的命令及其简要说明。print:浏览 Java 对象。print 命令调用对象的 toString()方法,因此其输出格式将根据对象类的不同而不同。类由其对象标识或名称指定。如果类已经被加载了,则可使用子字符串,例如用 Thread 表示的 java.lang.Thread。print 支持 Java 表达式,如 print MyClass.clsVar。dump:转储对象的实例变量。对象由其对象标识(一个十六进制整数)指定。类由其对象
30、标识或名称指定。如果类已经被加载了,则可使用子字符串,例如用 Thread 表示的 java.lang.Thread。如果类未被加载,则必须指定其全名,该类将作为副作用加载。applet 运行前在所引用的类中设置断点时,就要用到这点。dump 命令支持 Java 表达式,如 dump 0 x12345678.myCache3.foo。目前还不支持方法调用。threads:列出线程。线程由其对象标识来引用。where:不带参数的 where 转储当前线程的堆栈(用 thread 命令来设置)。where all 转储当前线程组中所有线程的堆栈。where 线程标识转储指定线程的堆栈。线程标识的形
31、式为 t,如 t3。如果所请求的线程被挂起(由于位于断点处或通过 suspend 命令来挂起),则可用 print 和 dump 命令来浏览局部(堆栈)和实例变量。up 和 down 命令用于选择当前的堆栈框架。断点:在 jdb 中可以在类中设置断点,例如:stop at MyClass:45。必须指定源文件的行 号 或 方 法 名(断 点 此 时 设 在 该 方 法 的 第 一 个 指 令 处)。clear 命 令 使 用 clear MyClass:45Class:45 语法来删除断点。用不带参数的 clear 命令可列出当前设置的所有断点。cont 命令将使执行继续。用 step 命令可
32、进行单步操作。异常:当发生异常而 Java 程序的堆栈之上又没有捕获这种异常的语句时,Java 运行环境通常将转储该异常跟踪,然后退出。然而,在 jdb 下运行时,该异常被当作不可恢复的断点处理,jdb 将停止在抛出异常的指令上。如果该类是用-g 选项编译的,则可输出实例和局部变量以确定异常的起因。可用 catch 命令捕捉一些特殊异常,例如:catch FileNotFoundException 或 catch mypackage.BigTroubleException。Java 调试工具保留有这些异常的列表,当其中的一种被抛出时,则看作在抛出该异常的指令上有断点。ignore 命令将从该列
33、表中删除异常类。注意:ignore 命令不会使 Java 解释器忽略特殊异常,它只使调试程序忽略它们。选项:当在命令行中用 jdb 取代 Java 解释器时,jdb 接受的选项与 java 命令接受的选项相同。当将 jdb 附接到正在运行的 Java 解释器会话上时,jdb 接受下列选项:-host 设置主机名,该主机上附接的解释器会话正在运行。-password “登录”到活动的解释器会话中。这是用-Xdebug 选项进行调用时 Java 解释器输出的口令。环境变量:CLASSPATH 用于为系统提供用户定义类的路径。目录用冒号分隔,例如:.:/home/avh/classes:/usr/l
34、ocal/java/classes 例如,对前一小节中的 HelloWorld.class,运用 jdb 对它调试如下:D:jdb HelloWorld Initializing jdb.stop in HelloWorld.main Deferring breakpoint HelloWorld.main.It will be set after the class is loaded.run run HelloWorld Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable VM Started
35、:Set deferred breakpoint HelloWorld.main Breakpoint hit:thread=main,HelloWorld.main(),line=8 bci=0 8 System.out.println(str);/显示 HelloWorld.main1 print HelloWorld.str HelloWorld.str=Hello,World!main1 next Hello,World!Step completed:thread=main,HelloWorld.main(),line=9 bci=9 9 main1 next The applicat
36、ion exited 事实上,对于 C 或 C+来说,由于 Java 少了指针等令人困扰的因素,Java 语言程序开发的过程中使用调试器的机会并不多。2.6 本章小结 Java 程序需要在 Java 虚拟机上运行,Java 虚拟机是 Java 程序的运行平台。Java 虚拟机屏蔽了与具体平台相关的信息,因此只要实现了 Java 虚拟机,Java 程序就可以在任何平台上运行。Java 2 SDK 是 Sun 免费提供开发工具,Java2SDK 包括了 Java 程序开发包和 Java程序运行环境。Java2SDK 中的 javac 用于把 Java 源代码编译成字节码,而 java 则用于解释执
37、行 Java 字节码。Java2SDK 还提供了用于调试的工具 jdb。Java 源代码可以用任何文本编辑器编辑。对于初学者而言,采用 JBuilder 等可视化集成开发环境对语言学习并无益处,因此建议用 UltraEdit 或者 Emacs 等编辑器进行 Java 源代码的编辑。Java 程序可分为两类,一类是 Application,另一类是 Applet。Application 必须有一个main 方法作为程序入口,而 Applet 则通过继承 Applet 实现。2.7 上机练习 1.验证本章例子。2.编写一个简单的 Java 应用程序(Application)和小程序(Applet)。3.利用 jdb 对 HelloWorldApplet 的运行过程进行跟踪。2.8 习题 1.什么是 Java 虚拟机?什么是 Java 运行时环境?什么是 Java2SDK?2.Java2SDK 常用的工具是什么?3.Java 程序源代码都有哪些部分组成?请写出一个最简单的 Java 程序。4.Java 应用程序(Application)和小程序(Applet)的区别是什么?
限制150内