对于Java注释我们主要了解两种:
// 注释一行
/* ...... */ 注释若干行
但还有第三种,文档注释:
/** ...... */ 注释若干行,并写入 javadoc 文档
通常这种注释的多行写法如下:
/**
* .........
* .........
*/
很多人多忽视了这第三种注释,那么这第三种注释有什么用?javadoc 又是什么东西?下面我们就谈谈。
一. Java 文档和 Javadoc
Java 程序员都应该知道使用 JDK 开发,最好的帮助信息就来自 SUN 发布的 Java 文档。它分包、分类具体的提供了各方法、属性的帮助信息,具有具体的类树信息、索引信息等,并提供了许多相关类之间的关系,如继续、实现接口、引用等。
Java 文档全是由一些 Html 文件组织起来的,在 SUM 的站点上可以下载它们的压缩包。但是你肯定想不到,这些文档我们可以自己生成。——就此打住,再吊一次胃口。
安装了 JDK 之后,安装目录下有一个 src.jar 文件或者 src.zip 文件,它们都是以 ZIP 格式压缩的,可以使用 WinZip 解压。解压之后,我们就可以看到分目录放的全是 .java 文件。是了,这些就是 Java 运行类的源码了,非常完整,连注释都写得一清二楚……不过,怎么看这些注释都有点似曾相识的感觉?
这就不希奇了,我们的迷底也快要揭开了。假如你仔细对比一下 .java 源文件中的文档注释 (/** ... */) 和 Java 文档的内容,你会发现它们就是一样的。Java 文档只是还在格式和排版上下了些功夫。再仔细一点,你会发现 .java 源文件中的注释还带有 HTML 标识,如 <B>、
、<Code> 等,在 Java 文档中,该出现这些标识的地方,已经按标识的的定义进行了排版。
终于真像大白了,原来 Java 文档是来自这些注释。难怪这些注释叫做文档注释呢!不过,是什么工具把这些注释变成文档的呢?
是该请出 javadoc 的时候了。在 JDK 的 bin 目录下你可以找到 javadoc,假如是 Windows 下的 JDK,它的文件名为 javadoc.exe。使用 javdoc 编译 .java 源文件时,它会读出 .java 源文件中的文档注释,并按照一定的规则与 Java 源程序一起进行编译,生成文档。
介绍 javadoc 的编译命令之前,还是先了解一下文档注释的格式吧。不过为了能够编译下面提到的若干例子,这里先介绍一条 javadoc 命令:
javadoc -d 文档存放目录 -author -version 源文件名.java
这条命令编译一个名为 “源文件名.java”的 java 源文件,并将生成的文档存放在“文档存放目录”指定的目录下,生成的文档中 index.html 就是文档的首页。-author 和 -version 两上选项可以省略。
二. 文档注释的格式
文档注释可以用于对类、属性、方法等进行说明。写文档注释时除了需要使用 /** .... */ 限定之外,还需要注重注释内部的一些细节问题。
1. 文档和文档注释的格式化
生成的文档是 HTML 格式,而这些 HTML 格式的标识符并不是 javadoc 加的,而是我们在写注释的时候写上去的。比如,需要换行时,不是敲入一个回车符,而是写入
,假如要分段,就应该在段前写入 <p>。
因此,格式化文档,就是在文档注释中添加相应的 HTML 标识。
文档注释的正文并不是直接复制到输出文件 (文档的 HTML 文件),而是读取每一行后,删掉前导的 * 号及 * 号以前的空格,再输入到文档的。如
/**
* This is first line.
***** This is second line.
This is third line.
*/
编译输出后的 HTML 源码则是
This is first line.
This is second line.
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>