對於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>
<BR>
<Code> 等
在 Java 文檔中
該出現這些標識的地方
已經按標識的的定義進行了排版
終於真像大白了
原來 Java 文檔是來自這些注釋
難怪這些注釋叫做文檔注釋呢!不過
是什麼工具把這些注釋變成文檔的呢?
是該請出 javadoc 的時候了
在 JDK 的 bin 目錄下你可以找到 javadoc
如果是 Windows 下的 JDK
它的文件名為 javadoc
exe
使用 javdoc 編譯
java 源文件時
它會讀出
java 源文件中的文檔注釋
並按照一定的規則與 Java 源程序一起進行編譯
生成文檔
介紹 javadoc 的編譯命令之前
還是先了解一下文檔注釋的格式吧
不過為了能夠編譯下面提到的若干例子
這裡先介紹一條 javadoc 命令
javadoc
d 文檔存放目錄
author
version 源文件名
java
這條命令編譯一個名為
源文件名
java
的 java 源文件
並將生成的文檔存放在
文檔存放目錄
指定的目錄下
生成的文檔中 l 就是文檔的首頁
author 和
version 兩上選項可以省略
二
文檔注釋的格式
文檔注釋可以用於對類
屬性
方法等進行說明
寫文檔注釋時除了需要使用 /**
*/ 限定之外
還需要注意注釋內部的一些細節問題
文檔和文檔注釋的格式化
生成的文檔是 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 語句不在此列
所以這個文檔注釋就被當作錯誤說明省略掉了
文檔注釋的三部分
根據在文檔中顯示的效果
文檔注釋分為三部分
先舉例如下
以便說明
/**
* show 方法的簡述
* <p>show 方法的詳細說明第一行<br>
* show 方法的詳細說明第二行
* @param b true 表示顯示
false 表示隱藏
* @return 沒有返回值
*/
public void show(boolean b) {
frame
show(b);
}
第一部分是簡述
文檔中
對於屬性和方法都是先有一個列表
然後才在後面一個一個的詳細的說明
列表中屬性名或者方法名後面那段說明就是簡述
如下圖中被紅框框選的部分
簡述部分寫在一段文檔注釋的最前面
第一個點號 (
) 之前 (包括點號)
換句話說
就是用第一個點號分隔文檔注釋
之前是簡述
之後是第二部分和第三部分
如上例中的
* show 方法的簡述
有時
即使正確地以一個點號作為分隔
javadoc 仍然會出錯
把點號後面的部分也做為了第一部分
為了解決這個問題
我們可以使用一個 <p> 標志將第二分部分開為下一段
如上例的
* <p>show 方法的詳細說明第一行
除此之外
我們也可以使用 <br> 來分隔
第二部分是詳細說明部分
該部分對屬性或者方法進行詳細的說明
在格式上沒有什麼特殊的要求
可以包含若干個點號
它在文檔中的位置如下圖所示
這部分文檔在上例中相應的代碼是
* show 方法的簡述
* <p>show 方法的詳細說明第一行<br>
* show 方法的詳細說明第二行
發現什麼了?對了
簡述也在其中
這一點要記住了
不要畫蛇添足——在詳細說明部分中再寫一次簡述哦!
第三部分是特殊說明部分
這部分包括版本說明
參數說明
返回值說明等
它在文檔中的位置
第三部分在上例中相應的代碼是
* @param b true 表示顯示
false 表示隱藏
* @return 沒有返回值
除了 @param 和 @return 之外
還有其它的一些特殊標記
分別用於對類
屬性和方法的說明……不要推我
我馬上就說
三
使用 javadoc 標記
javadoc 標記是插入文檔注釋中的特殊標記
它們用於標識代碼中的特殊引用
javadoc 標記由
@
及其後所跟的標記類型和專用注釋引用組成
記住了
三個部分——@
標記類型
專用注釋引用
不過我寧願把它分成兩部分
@ 和標記類型
專用注釋引用
雖然 @ 和 標記類型之間有時可以用空格符分隔
但是我寧願始終將它們緊挨著寫
以減少出錯機會
javadoc 標記有如下一些
下面詳細說明各標記
@see 的使用
@see 的句法有三種
@see 類名
@see #方法名或屬性名
@see 類名#方法名或屬性名
類名
可以根據需要只寫出類名 (如 String) 或者寫出類全名 (如 java
lang
String)
那麼什麼時候只需要寫出類名
什麼時候需要寫出類全名呢?
如果 java 源文件中的 import 語句包含了的類
可以只寫出類名
如果沒有包含
則需要寫出類全名
java
lang 也已經默認被包含了
這和 javac 編譯 java 源文件時的規定一樣
所以可以簡單的用 javac 編譯來判斷
源程序中 javac 能找到的類
javadoc 也一定能找到
javac 找不到的類
javadoc 也找不到
這就需要使用類全名了
方法名或者屬性名
如果是屬性名
則只需要寫出屬性名即可
如果是方法名
則需要寫出方法名以及參數類型
沒有參數的方法
需要寫出一對括號
如
有時也可以偷懶
假如上例中
沒有 count 這一屬性
那麼參考方法 count() 就可以簡寫成 @see count
不過
為了安全起見
還是寫全 @see count() 比較好
@see 的第二個句法和第三個句法都是轉向方法或者屬性的參考
它們有什麼區別呢?
第二
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19537.html