Java编程思想第4版[中文版](PDF格式)-第26部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
2。7 我们的第一个 Java 程序
最后,让我们正式编一个程序(注释⑤)。它能打印出与当前运行的系统有关的资料,并利用了来自Java 标
准库的 System 对象的多种方法。注意这里引入了一种额外的注释样式:“//”。它表示到本行结束前的所有
内容都是注释:
// Property。java
import java。util。*;
public class Property {
public static void main(String'' args) {
System。out。println(new Date());
Properties p = System。getProperties();
53
…………………………………………………………Page 55……………………………………………………………
p。list(System。out);
System。out。println(〃……Memory Usage:〃);
Runtime rt = Runtime。getRuntime();
System。out。println(〃Total Memory = 〃
+ rt。totalMemory()
+ 〃 Free Memory = 〃
+ rt。freeMemory());
}
}
⑤:在某些编程环境里,程序会在屏幕上一切而过,甚至没机会看到结果。可将下面这段代码置于 main()的
末尾,用它暂停输出:
try {
Thread。currentThread()。sleep(5 * 1000);
} catch(InterruptedException e) {}
}
它的作用是暂停输出5 秒钟。这段代码涉及的一些概念要到本书后面才会讲到。所以目前不必深究,只知道
它是让程序暂停的一个技巧便可。
在每个程序文件的开头,都必须放置一个 import 语句,导入那个文件的代码里要用到的所有额外的类。注意
我们说它们是“额外”的,因为一个特殊的类库会自动导入每个Java 文件:java。lang。启动您的Web 浏览
器,查看由 Sun 提供的用户文档(如果尚未从 http://java。sun。 下载,或用其他方式安装了Java 文
档,请立即下载)。在 packages。html 文件里,可找到Java 配套提供的所有类库名称。请选择其中的
java。lang。在“Class Index”下面,可找到属于那个库的全部类的列表。由于 java。lang 默认进入每个
Java 代码文件,所以这些类在任何时候都可直接使用。在这个列表里,可发现System 和 Runtime,我们在
Property。java 里用到了它们。java。lang 里没有列出 Date 类,所以必须导入另一个类库才能使用它。如果
不清楚一个特定的类在哪个类库里,或者想检视所有的类,可在Java 用户文档里选择“Class Hierarchy”
(类分级结构)。在Web 浏览器中,虽然要花不短的时间来建立这个结构,但可清楚找到与Java 配套提供的
每一个类。随后,可用浏览器的“查找”(Find )功能搜索关键字“Date ”。经这样处理后,可发现我们的
搜索目标以 java。util。Date 的形式列出。我们终于知道它位于util 库里,所以必须导入 java。util。*;否
则便不能使用Date 。
观察packages。html 文档最开头的部分(我已将其设为自己的默认起始页),请选择java。lang,再选
System。这时可看到System 类有几个字段。若选择 out,就可知道它是一个static PrintStream 对象。由
于它是“静态”的,所以不需要我们创建任何东西。out 对象肯定是 3,所以只需直接用它即可。我们能对这
个out 对象做的事情由它的类型决定:PrintStream。PrintStream 在说明文字中以一个超链接的形式列出,
这一点做得非常方便。所以假若单击那个链接,就可看到能够为PrintStream 调用的所有方法。方法的数量
不少,本书后面会详细介绍。就目前来说,我们感兴趣的只有 println()。它的意思是“把我给你的东西打
印到控制台,并用一个新行结束”。所以在任何Java 程序中,一旦要把某些内容打印到控制台,就可条件反
射地写上System。out。println(〃内容〃)。
类名与文件是一样的。若象现在这样创建一个独立的程序,文件中的一个类必须与文件同名(如果没这样
做,编译器会及时作出反应)。类里必须包含一个名为main()的方法,形式如下:
public static void main(String'' args) {
其中,关键字“public”意味着方法可由外部世界调用(第5 章会详细解释)。main()的自变量是包含了
String 对象的一个数组。args 不会在本程序中用到,但需要在这个地方列出,因为它们保存了在命令行调用
的自变量。
程序的第一行非常有趣:
System。out。println(new Date());
请观察它的自变量:创建Date 对象唯一的目的就是将它的值发送给 println()。一旦这个语句执行完毕,
Date 就不再需要。随之而来的“垃圾收集器”会发现这一情况,并在任何可能的时候将其回收。事实上,我
们没太大的必要关心“清除”的细节。
第二行调用了System。getProperties() 。若用Web 浏览器查看联机用户文档,就可知道 getProperties()是
54
…………………………………………………………Page 56……………………………………………………………
System 类的一个 static方法。由于它是“静态”的,所以不必创建任何对象便可调用该方法。无论是否存
在该类的一个对象,static 方法随时都可使用。调用getProperties()时,它会将系统属性作为 Properties
类的一个对象生成(注意Properties 是“属性”的意思)。随后的的句柄保存在一个名为p 的Properties
句柄里。在第三行,大家可看到Properties 对象有一个名为 list()的方法,它将自己的全部内容都发给一
个我们作为自变量传递的PrintStream 对象。
main()的第四和第六行是典型的打印语句。注意为了打印多个String 值,用加号(+)分隔它们即可。然
而,也要在这里注意一些奇怪的事情。在 String 对象中使用时,加号并不代表真正的“相加”。处理字串
时,我们通常不必考虑“+”的任何特殊含义。但是,Java 的String 类要受一种名为“运算符过载”的机制
的制约。也就是说,只有在随同String 对象使用时,加号才会产生与其他任何地方不同的表现。对于字串,
它的意思是“连接这两个字串”。
但事情到此并未结束。请观察下述语句:
System。out。println(〃Total Memory = 〃
+ rt。totalMemory()
+ 〃 Free Memory = 〃
+ rt。freeMemory());
其中,totalMemory()和freeMemory ()返回的是数值,并非String 对象。如果将一个数值“加”到一个字串
身上,会发生什么情况呢?同我们一样,编译器也会意识到这个问题,并魔术般地调用一个方法,将那个数
值(int,float 等等)转换成字串。经这样处理后,它们当然能利用加号“加”到一起。这种“自动类型转
换”亦划入“运算符过载”处理的范畴。
许多Java 著作都在热烈地辩论“运算符过载”(C++的一项特性)是否有用。目前就是反对它的一个好例
子!然而,这最多只能算编译器(程序)的问题,而且只是对 String 对象而言。对于自己编写的任何源代
码,都不可能使运算符“过载”。
通过为 Runtime 类调用 getRuntime()方法,main()的第五行创建了一个Runtime 对象。返回的则是指向一个
Runtime 对象的句柄。而且,我们不必关心它是一个静态对象,还是由 new 命令创建的一个对象。这是由于
我们不必为清除工作负责,可以大模大样地使用对象。正如显示的那样,Runtime 可告诉我们与内存使用有
关的信息。
2。8 注释和嵌入文档
Java 里有两种类型的注释。第一种是传统的、C 语言风格的注释,是从 C++继承而来的。这些注释用一个
“/*”起头,随后是注释内容,并可跨越多行,最后用一个“*/”结束。注意许多程序员在连续注释内容的
每一行都用一个“*”开头,所以经常能看到象下面这样的内容:
/* 这是
* 一段注释,
* 它跨越了多个行
*/
但请记住,进行编译时,/*和*/之间的所有东西都会被忽略,所以上述注释与下面这段注释并没有什么不
同:
/* 这是一段注释,
它跨越了多个行 */
第二种类型的注释也起源于C++。这种注释叫作“单行注释”,以一个“//”起头,表示这一行的所有内容
都是注释。这种类型的注释更常用,因为它书写时更方便。没有必要在键盘上寻找“/”,再寻找“*”(只
需按同样的键两次),而且不必在注释结尾时加一个结束标记。下面便是这类注释的一个例子:
// 这是一条单行注释
55
…………………………………………………………Page 57……………………………………………………………
2。8。1 注释文档
对于Java 语言,最体贴的一项设计就是它并没有打算让人们为了写程序而写程序——人们也需要考虑程序的
文档化问题。对于程序的文档化,最大的问题莫过于对文档的维护。若文档与代码分离,那么每次改变代码
后都要改变文档,这无疑会变成相当麻烦的一件事情。解决的方法看起来似乎很简单:将代码同文档“链
接”起来。为达到这个目的,最简单的方法是将所有内容都置于同一个文件。然而,为使一切都整齐划一,
还必须使用一种特殊的注释语法,以便标记出特殊的文档;另外还需要一个工具,用于提取这些注释,并按
有价值的形式将其展现出来。这些都是Java 必须做到的。
用于提取注释的工具叫作javadoc。它采用了部分来自Java 编译器的技术,查找我们置入程序的特殊注释标
记。它不仅提取由这些标记指示的信息,也将毗邻注释的类名或方法名提取出来。这样一来,我们就可用最
轻的工作量,生成十分专业的程序文档。
javadoc输出的是一个 HTML 文件,可用自己的Web 浏览器查看。该工具允许我们创建和管理单个源文件,并
生动生成有用的文档。由于有了jvadoc,所以我们能够用标准的方法创建文档。而且由于它非常方便,所以
我们能轻松获得所有Java 库的文档。
2。8。2 具体语法
所有 javadoc命令都只能出现于“/**”注释中。但和平常一样,注释结束于一个“*/”。主要通过两种方式
来使用 javadoc:嵌入的HTML ,或使用“文档标记”。其中,“文档标记”(Doc tags)是一些以“@”开头
的命令,置于注释行的起始处(但前导的“*”会被忽略)。
有三种类型的注释文档,它们对应于位于注释后面的元素:类、变量或者方法。也就是说,一个类注释正好
位于一个类定义之前;变量注释正好位于变量定义之前;而一个方法定义正好位于一个方法定义的前面。如
下面这个简单的例子所示:
/** 一个类注释 */
public class docTest {
/** 一个变量注释 */
public int i;
/** 一个方法注释 */
public void f() {}
}
注意 javadoc 只能为 public (公共)和protected (受保护)成员处理注释文档。“private”(私有)和
“友好”(详见5 章)成员的注释会被忽略,我们看不到任何输出(也可以用…private 标记包括private 成
员)。这样做是有道理的,因为只有public 和protected 成员才可在文件之外使用,这是客户程序员的希
望。然而,所有类注释都会包含到输出结果里。
上述代码的输出是一个 HTML 文件,它与其他Java 文档具有相同的标准格式。因此,用户会非常熟悉这种格
式,可在您设计的类中方便地“漫游”。设计程序时,请务必考虑输入上述代码,用 javadoc处理一下,观
看最终HTML 文件的效果如何。
2。8。3 嵌入 HTML
javadoc将 HTML 命令传递给最终生成的 HTML 文档。这便使我们能够充分利用HTML 的巨大威力。当然,我们
的最终动机是格式化代码,不是为了哗众取宠。下面列出一个例子:
/**
*
* System。out。println(new Date());
*
*/
亦可象在其他Web 文档里那样运用 HTML ,对普通文本进行格式化,使其更具条理、更加美观:
/**
56
…………………………………………………………Page 58……………………………………………………………
* 您甚至可以插入一个列表:
*
* 项目一
* 项目二
* 项目三
*
*/
注意在文档注释中,位于一行最开头的星号会被javadoc 丢弃。同时丢弃的还有前导空格。javadoc 会对所
有内容进行格式化,使其与标准的文档外观相符。不要将或这样的标题当作嵌入 HTML 使用,因为
javadoc会插入自己的标题,我们给出的标题会与之冲撞。
所有类