java编程思想4

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();
54
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://www.java.sun.com下载,或用其他方式安装了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()是
55
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++。这种注释叫作“单行注释”,以一个“//”起头,表示这一行的所有内容
都是注释。这种类型的注释更常用,因为它书写时更方便。没有必要在键盘上寻找“/”,再寻找“*”(只
需按同样的键两次),而且不必在注释结尾时加一个结束标记。下面便是这类注释的一个例子:
// 这是一条单行注释
56
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 的巨大威力。当然,我们
的最终动机是格式化代码,不是为了哗众取宠。下面列出一个例子:
/**
* <pre>
* System.out.println(new Date());
* </pre>
*/
亦可象在其他Web文档里那样运用 HTML,对普通文本进行格式化,使其更具条理、更加美观:
/**
57
* 您<em>甚至</em>可以插入一个列表:
* <ol>
* <li> 项目一
* <li> 项目二
* <li> 项目三
* </ol>
*/
注意在文档注释中,位于一行最开头的星号会被javadoc 丢弃。同时丢弃的还有前导空格。javadoc 会对所
有内容进行格式化,使其与标准的文档外观相符。不要将<h1>或<hr>这样的标题当作嵌入 HTML 使用,因为
javadoc会插入自己的标题,我们给出的标题会与之冲撞。
所有类型的注释文档——类、变量和方法——都支持嵌入 HTML。
2.8.4 @see :引用其他类
所有三种类型的注释文档都可包含@see 标记,它允许我们引用其他类里的文档。对于这个标记,javadoc会
生成相应的 HTML,将其直接链接到其他文档。格式如下:
@see 类名
@see 完整类名
@see 完整类名#方法名
每一格式都会在生成的文档里自动加入一个超链接的“See Also”(参见)条目。注意 javadoc不会检查我
们指定的超链接,不会验证它们是否有效。
2.8.5 类文档标记
随同嵌入HTML 和@see 引用,类文档还可以包括用于版本信息以及作者姓名的标记。类文档亦可用于“接
口”目的(本书后面会详细解释)。
1. @version
格式如下:
@version 版本信息
其中,“版本信息”代表任何适合作为版本说明的资料。若在 javadoc命令行使用了“-version”标记,就
会从生成的 HTML 文档里提取出版本信息。
2. @author
格式如下:
@author 作者信息
其中,“作者信息”包括您的姓名、电子函件地址或者其他任何适宜的资料。若在javadoc命令行使用了“-
author”标记,就会专门从生成的HTML 文档里提取出作者信息。
可为一系列作者使用多个这样的标记,但它们必须连续放置。全部作者信息会一起存入最终HTML 代码的单独
一个段落里。
2.8.6 变量文档标记
变量文档只能包括嵌入的HTML 以及@see 引用。
2.8.7 方法文档标记
除嵌入HTML 和@see 引用之外,方法还允许使用针对参数、返回值以及违例的文档标记。
1. @param
格式如下:
58
@param 参数名 说明
其中,“参数名”是指参数列表内的标识符,而“说明”代表一些可延续到后续行内的说明文字。一旦遇到
一个新文档标记,就认为前一个说明结束。可使用任意数量的说明,每个参数一个。
2. @return
格式如下:
@return 说明
其中,“说明”是指返回值的含义。它可延续到后面的行内。
3. @exception
有关“违例”(Exception)的详细情况,我们会在第 9 章讲述。简言之,它们是一些特殊的对象,若某个方
法失败,就可将它们“扔出”对象。调用一个方法时,尽管只有一个违例对象出现,但一些特殊的方法也许
能产生任意数量的、不同类型的违例。所有这些违例都需要说明。所以,违例标记的格式如下:
@exception 完整类名 说明
其中,“完整类名”明确指定了一个违例类的名字,它是在其他某个地方定义好的。而“说明”(同样可以
延续到下面的行)告诉我们为什么这种特殊类型的违例会在方法调用中出现。
4. @deprecated
这是Java 1.1 的新特性。该标记用于指出一些旧功能已由改进过的新功能取代。该标记的作用是建议用户不
必再使用一种特定的功能,因为未来改版时可能摒弃这一功能。若将一个方法标记为@deprecated,则使用该
方法时会收到编译器的警告。
2.8.8 文档示例
下面还是我们的第一个 Java 程序,只不过已加入了完整的文档注释:
//: Property.java
import java.util.*;
/** The first Thinking in Java example program.
* Lists system information on current machine.
* @author Bruce Eckel
* @author http://www.BruceEckel.com
* @version 1.0
*/
public class Property {
/** Sole entry point to class & application
* @param args array of string arguments
* @return No return value
* @exception exceptions No exceptions thrown
*/
public static void main(String[] args) {
System.out.println(new Date());
Properties p = System.getProperties();
p.list(System.out);
System.out.println("--- Memory Usage:");
Runtime rt = Runtime.getRuntime();
System.out.println("Total Memory = "
+ rt.totalMemory()
+ " Free Memory = "
+ rt.freeMemory());
}
59
} ///:~
第一行:
//: Property.java
采用了我自己的方法:将一个“:”作为特殊的记号,指出这是包含了源文件名字的一个注释行。最后一行也
用这样的一条注释结尾,它标志着源代码清单的结束。这样一来,可将代码从本书的正文中方便地提取出
来,并用一个编译器检查。这方面的细节在第 17章讲述。
2.9 编码样式
一个非正式的Java 编程标准是大写一个类名的首字母。若类名由几个单词构成,那么把它们紧靠到一起(也
就是说,不要用下划线来分隔名字)。此外,每个嵌入单词的首字母都采用大写形式。例如:
class AllTheColorsOfTheRainbow { // ...}
对于其他几乎所有内容:方法、字段(成员变量)以及对象句柄名称,可接受的样式与类样式差不多,只是
标识符的第一个字母采用小写。例如:
class AllTheColorsOfTheRainbow {
int anIntegerRepresentingColors;
void changeTheHueOfTheColor(int newHue) {
// ...
}
// ...
}
当然,要注意用户也必须键入所有这些长名字,而且不能输错。
2.10 总结
通过本章的学习,大家已接触了足够多的Java 编程知识,已知道如何自行编写一个简单的程序。此外,对语
言的总体情况以及一些基本思想也有了一定程度的认识。然而,本章所有例子的模式都是单线形式的“这样
做,再那样做,然后再做另一些事情”。如果想让程序作出一项选择,又该如何设计呢?例如,“假如这样
做的结果是红色,就那样做;如果不是,就做另一些事情”。对于这种基本的编程方法,下一章会详细说明
在Java 里是如何实现的。
2.11 练习
(1) 参照本章的第一个例子,创建一个“Hello,World”程序,在屏幕上简单地显示这句话。注意在自己的
类里只需一个方法(“main”方法会在程序启动时执行)。记住要把它设为static 形式,并置入自变量列
表——即使根本不会用到这个列表。用javac 编译这个程序,再用java 运行它。
(2) 写一个程序,打印出从命令行获取的三个自变量。
(3) 找出Property.java 第二个版本的代码,这是一个简单的注释文档示例。请对文件执行javadoc,并在
自己的Web 浏览器里观看结果。
(4) 以练习(1)的程序为基础,向其中加入注释文档。利用javadoc,将这个注释文档提取为一个HTML 文
件,并用Web浏览器观看。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值