对于注释我们主要了解两种: // 注释一行 /* ...... */ 注释若干行 但还有第三种,文档注释: /** ...... */ 注释若干行,并写入 javadoc 文档 通常这种注释的多行写法如下: /** * ......... * ......... */ 很多人多忽视了这第三种注释,那么这第三种注释有什么用?javadoc 又是什么东西?下面我们就谈谈。 一. 文档和 Javadoc Java 程序员都应该知道使用 JDK 开发,最好的帮助信息就来自 SUN 发布的 Java 文档。它分包、分类详细的提供了各方法、属性的帮助信息,具有详细的类树信息、索引信息等,并提供了许多相关类之间的关系,如继承、实现接口、引用等。 Java 文档全是由一些 html 文件组织起来的,在 SUM 的站点上可以它们的压缩包。但是你肯定想不到,这些文档我们可以自己生成。——就此打住,再吊一次胃口。 安装了 JDK 之后,安装目录下有一个 src.jar 文件或者 src.zip 文件,它们都是以 ZIP 格式压缩的,可以使用 WinZip 解压。解压之后,我们就可以看到分目录放的全是 .java 文件。是了,这些就是 Java 运行类的源码了,非常完整,连注释都写得一清二楚……不过,怎么看这些注释都有点似曾相识的感觉? 这就不奇怪了,我们的迷底也快要揭开了。如果你仔细对比一下 .java 源文件中的文档注释 (/** ... */) 和 Java 文档的内容,你会发现它们就是一样的。Java 文档只是还在格式和排版上下了些功夫。再仔细一点,你会发现 .java 源文件中的注释还带有 HTML 标识,如 <B>、<BR>、<Code> 等,在 Java 文档中,该出现这些标识的地方,已经按标识的的定义进行了排版。 终于真像大白了,原来 Java 文档是来自这些注释。难怪这些注释叫做文档注释呢!不过,是什么工具把这些注释变成文档的呢? 是该请出 javadoc 的时候了。在 JDK 的 bin 目录下你可以找到 javadoc,如果是 下的 JDK,它的文件名为 javadoc.exe。使用 javdoc 编译 .java 源文件时,它会读出 .java 源文件中的文档注释,并按照一定的规则与 Java 源程序一起进行编译,生成文档。 介绍 javadoc 的编译命令之前,还是先了解一下文档注释的格式吧。不过为了能够编译下面提到的若干例子,这里先介绍一条 javadoc 命令: javadoc -d 文档存放目录 -author -version 源文件名.java 这条命令编译一个名为 “源文件名.java”的 java 源文件,并将生成的文档存放在“文档存放目录”指定的目录下,生成的文档中 index.html 就是文档的首页。-author 和 -version 两上选项可以省略。 二. 文档注释的格式 文档注释可以用于对类、属性、方法等进行说明。写文档注释时除了需要使用 /** .... */ 限定之外,还需要注意注释内部的一些细节问题。 1. 文档和文档注释的格式化 生成的文档是 HTML 格式,而这些 HTML 格式的标识符并不是javadoc 加的,而是我们在写注释的时候写上去的。比如,需要换行时,不是敲入一个回车符,而是写入 <br>,如果要分段,就应该在段前写入 <p>。 因此,格式化文档,就是在文档注释中添加相应的 HTML 标识。 文档注释的正文并不是直接复制到输出文件 (文档的 HTML 文件),而是读取每一行后,删掉前导的 * 号及 * 号以前的空格,再输入到文档的。如 /** * This is first line. <br> ***** This is second line. <br> This is third line. */ 编译输出后的 HTML 源码则是 This is first line. <br> This is second line. <br> This is third line. 前导的 * 号允许连续使用多个,其效果和使用一个 * 号一样,但多个 * 号前不能有其它字符分隔,否则分隔符及后面的 * 号都将作为文档的内容。* 号在这里是作为左边界使用,如上例的第一行和第二行;如果没有前导的 * 号,则边界从第一个有效字符开始,而不包括前面的空格,如上例第三行。 还有一点需要说明,文档注释只说明紧接其后的类、属性或者方法。如下例: /** comment for class */ public class Test { /** comment for a attribute */ int number; /** comment for a method */ public void myMethod() { ...... } ...... } 上例中的三处注释就是分别对类、属性和方法的文档注释。它们生成的文档分别是说明紧接其后的类、属性、方法的。“紧接”二字尤其重要,如果忽略了这一点,就很可能造成生成的文档错误。如 import java.lang.*; /** commnet for class */ public class Test { ...... } // 此例为正确的例子 这个文档注释将生成正确的文档。但只需要改变其中两行的位置,变成下例,就会出错: /** commnet for class */ import java.lang.*; public class Test { ...... } // 此例为错误的例子 这个例子只把上例的 import 语句和文档注释部分了位置,结果却大不相同——生成的文档中根本就找不到上述注释的内容了。原因何在? “/** commnet for class */”是对 class Test 的说明,把它放在“public class Test { ...... }”之前时,其后紧接着 class Test,符合规则,所以生成的文档正确。但是把它和“import java.lang.*;”调换了位置后,其后紧接的就是不 class Test 了,而是一个 import 语句。由于文档注释只能说明类、属性和方法,import 语句不在此列,所以这个文档注释就被当作错误说明省略掉了。 2. 文档注释的三部分 根据在文档中显示的效果,文档注释分为三部分。先举例如下,以便说明。 /** * show 方法的简述. * <p>show 方法的详细说明第一行<br> * show 方法的详细说明第二行 * @param b true 表示显示,false 表示隐藏 * @return 没有返回值 */ public void show(boolean b) { frame.show(b); } 第一部分是简述。文档中,对于属性和方法都是先有一个列表,然后才在后面一个一个的详细的说明。列表中属性名或者方法名后面那段说明就是简述。如下图中被红框框选的部分: