主要種類
對於Java注釋我們主要了解三種:
1, // 注釋一行
2, /* ...... */ 注釋若干行
3, /**……*/文檔注釋
說明
/** ...... */ 注釋若干行,並寫入 javadoc文檔通常這種注釋的多行寫法如下:
/**
* .........
* .........
*/
javadoc提取注釋的工具/**注釋內容*/ (其餘兩種和C++注釋一樣).
註:注釋內容即不會被編譯的內容,只是解釋說明
注釋例子
import java.awt.*; //調用awt包
import java.applet.*;
import java.awt.Color; //調用awt中的Color類
public class extends Applet implements Runnable {
Image buffer;// 定義圖像對象
Graphics gContext;// 定義
圖形上下文Thread animate;// 定義一個執行緒
String s = "這是文字動畫";
int w, h, x, y, size = 12; // 定義整形變數並賦值
/**
* Applet初始化
*
* @see java.applet.Applet
* @return 無
*/
public void init() {
w = getWidth();// 返回組件的當前寬度。
h = getHeight();// 返回組件的當前高度。
buffer = createImage(w, h);// 創建一個寬W高H的圖形區域。 (創建一幅用於
雙緩衝的、可在螢幕外繪製的圖像)
gContext = buffer.getGraphics();// 獲得圖像使用的
圖形上下文gContext.setColor(Color.blue);// 設定圖形上下文的當前顏色為藍色
}
/**
* Thread 執行緒啟動操作
*/
public void start() {
// 開始animate執行緒
if (animate == null) {
animate = new Thread(this);
animate.start();
}
}
/**
* Thread 執行緒終止時的處理操作 以釋放資源
*/
public void stop() {
// 結束animate執行緒
if (animate != null)
animate = null;
}
/**
* Runnable接口的實現
* 執行所需的操作
*/
public void run() {
while (true) {
//X,Y的坐標設定
x = (w - s.length() * size) / 2;
y = (h + size) / 2;
gContext.setFont(new Font("宋體", Font.PLAIN, size));
gContext.drawString(s, x, y);//繪製一串
字元s內容的文本
repaint();//重畫圖形
try {
animate.sleep(50);//執行緒休眠50ms
} catch (InterruptedException e) {// 捕獲異常
}
gContext.clearRect(0, 0, w, h);//通過使用當前繪圖表面的背景色進行填充來清除指定的矩形.0 - 要清除矩形的x 坐標。0 - 要清除矩形的 y 坐標。w - 要清除矩形的寬度。h - 要清除矩形的高度。
if (++size > 40)
size = 12;
}
}
/**
* Applet畫圖操作方法
*
* @see java.applet.Applet
*/
public void paint(Graphics g) {
g.drawImage(buffer, 0, 0, this);//繪製指定的buffer的圖像
}
/**
* Applet刷新操作,重新繪製圖形
*
* @see java.applet.Applet
*/
public void update(Graphics g) {
paint(g);//重新調用paint函式繪製圖形
}
}
作用
通過注釋提高Java
源程式代碼的可讀性;使得Java程式條理清晰,易於區分代碼行與注釋行。另外通常在程式開頭加入作者,時間,版本,要實現的功能等內容注釋,方便後來的維護以及程式設計師的交流。
速算遊戲
規則如下:
1、點擊“開始遊戲”按鈕,遊戲開始,系統會發出四張牌
2、並把組合的
表達式(四張牌的四則混合運算表達式)輸入到輸入框裡(最終結果=24)
3、點擊“確定”按鈕,遊戲將會計算你輸入的表達式是否正確,並且給出提示
4、如果輸入的表達式不正確,則會讓用戶重新輸入,如果輸入的表達式正確,則重新開始遊戲
猜數字
importjava.util.Random;//一上來導入包不用說了吧publicclassCaishuzi{//伺服器連線埠號8181staticfinalintPORT=8181;//聲明一個伺服器套接字ServerSocketserverSocket;//客戶端套接字Socketsocket;//數據輸入流DataInputStreamnetIn;//數據輸出流DataOutputStreamnetOut;//隨機數的數組intrandomNum[];//遊戲等級intlevel=0;publicCaishuzi(){//猜數字的構造函式initRandomNum();waitConnect();}privatevoidinitRandomNum(){//初始化隨機數randomNum=newint[5];//數組初始化,大小為5Randomran=newRandom();//隨機數類for(inti=0;i<5;i++){randomNum[i]=ran.nextInt(100);//生成5個隨機數,範圍0~99}}//privatevoidwaitConnect(){//等待客戶端連線BufferedReaderansiIn=newBufferedReader(newInputStreamReader(System.out.println("伺服器啟動.");try{serverSocket=newServerSocket(PORT);//伺服器套接字System.out.println("等待客戶端連線......");socket=serverSocket.accept();//偵聽並接受到此套接字的連線,注意這句話會一直運行直到有客戶端連上System.out.println(""+socket);netIn=newDataInputStream(socket.getInputStream());netOut=newDataOutputStream(socket.getOutputStream());//分別得到客戶端的輸入輸出流,這樣就可以Client—Server間相互傳遞數據了}catch(Exceptione){e.printStackTrace();}}//privatevoidprocessAnswer(){//應答客戶端try{StringclientMsg=netIn.readUTF();//取得客戶端傳過來的字元while(!clientMsg.equals("end")){//不停循環,但如果客戶端傳過來的字元是"end",就結束了System.out.println("客戶端:"+clientMsg);System.out.print("生成隨機數為"+randomNum);intclientInputNum=Integer.parseInt(clientMsg);//把客戶端猜的數字轉成int型if(clientInputNum<0||clientInputNum>100)//小於0或大於100不行喔System.out.print("輸入超過範圍,請輸入0~100以內的數字");StringserverMsg="";if(clientInputNum==randomNum[level]){serverMsg="恭喜你猜對了!";}elseif(clientInputNum>randomNum[level]){serverMsg="您輸入太大了!";}elseif(clientInputNum<randomNum[level]){serverMsg="您輸入太小了!";}
//以上為猜的數字和伺服器生成的隨機數比,究竟是大於小於還是等於呢,把結果設到serverMsg變數netOut.writeUTF(serverMsg);//然後把信息傳到客戶端if(serverMsg.equals("end")){return;}clientMsg=netIn.readUTF();//繼續下一次猜數字}}catch(Exceptione){//System.out.print("連線關閉或數據處理錯誤");}}publicstaticvoidmain(String[]args){Caishuzis=newCaishuzi();}}
模組注釋
1、源檔案注釋
源檔案注釋採用 /** …… */,在每個源檔案的頭部要有必要的注釋信息,包括:檔案名稱;檔案編號;版本號;作者;創建時間;檔案描述包括本檔案歷史修改記錄等。中文注釋模版:
/**
* 文 件 名 :
* CopyRright
* 檔案編號:
* 創 建 人:
* 日 期:
* 修 改 人:
* 日 期:
* 描 述:
* 版 本 號:
*/
類(模組)注釋:
類(模組)注釋採用 /** …… */,在每個類(模組)的頭部要有必要的注釋信息,包括:工程名;類(模組)編號;命名空間;類可以運行的JDK版本;版本號;作者;創建時間;類(模組)功能描述(如功能、主要算法、內部各部分之間的關係、該類與其類的關係等,必要時還要有一些如特別的軟硬體要求等說明);主要函式或過程清單及本類(模組)歷史修改記錄等。
英文注釋模版:
/**
* CopyRright
* Project:
* Module ID:
* Comments:
* JDK version used:
* Namespace:
* Author:
* Create Date:
* Modified By:
* Modified Date:
* Why & What is modified
* Version:
java註解
Annotation(註解)是JDK5.0及以後版本引入的。它可以用於創建文檔,跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。註解是以‘@註解名’在代碼中存在的,根據註解參數的個數,我們可以將註解分為:標記註解、單值註解、完整註解三類。它們都不會直接影響到程式的語義,只是作為註解(標識)存在,我們可以通過
反射機制編程實現對這些元數據的訪問。另外,你可以在編譯時選擇代碼里的註解是否只存在於
原始碼級,或者它也能在class檔案中出現。
元數據的作用
如果要對於元數據的作用進行分類,大致可分為三類:
編寫文檔:通過代碼里標識的元數據生成文檔。
代碼分析:通過代碼里標識的元數據對代碼進行分析。
編譯檢查:通過代碼里標識的元數據讓編譯器能實現基本的編譯檢查
內置註解
@Override
Java代碼
packagecom.iwtxokhtd.annotation;
/**
* 測試Override註解
*@authorAdministrator
*
*/
publicclassOverrideDemoTest {
//@Override
publicString tostring(){
return"測試註解";
}
}
@Deprecated的作用是對不應該在使用的方法添加註解,當編程人員使用這些方法時,將會在編譯時顯示提示信息,它與javadoc里的@deprecated標記有相同的功能,準確的說,它還不如javadoc @deprecated,因為它不支持參數,使用@Deprecated的示例代碼示例如下:
Java代碼
packagecom.iwtxokhtd.annotation;
/**
* 測試Deprecated註解
*@authorAdministrator
*
*/
publicclassDeprecatedDemoTest {
publicstaticvoidmain(String[] args) {
//使用DeprecatedClass里聲明被過時的方法
DeprecatedClass.DeprecatedMethod();
}
}
classDeprecatedClass{
@Deprecated
publicstaticvoidDeprecatedMethod() {
}
}
@SuppressWarnings,其參數有:
deprecation,使用了過時的類或方法時的警告
unchecked,執行了未檢查的轉換時的警告
fallthrough,當 Switch 程式塊直接通往下一種情況而沒有 Break 時的警告
path,在類路徑、
源檔案路徑等中有不存在的路徑時的警告
serial,當在可序列化的類上缺少serialVersionUID 定義時的警告
finally ,任何 finally 子句不能正常完成時的警告
all,關於以上所有情況的警告
Java代碼
packagecom.iwtxokhtd.annotation;
importjava.util.ArrayList;
importjava.util.List;
publicclassSuppressWarningsDemoTest {
publicstaticListlist=newArrayList();
@SuppressWarnings("unchecked")
publicvoidadd(String data){
list.add(data);
自定義
它類似於新創建一個接口類檔案,但為了區分,我們需要將它聲明為@interface,如下例:
Java代碼
packagecom.iwtxokhtd.annotation;
public@interfaceNewAnnotation {
}
使用自定義的註解類型
Java代碼
packagecom.iwtxokhtd.annotation;
publicclassAnnotationTest {
@NewAnnotation
publicstaticvoidmain(String[] args) {
}
}
為自定義註解添加變數
Java代碼
packagecom.iwtxokhtd.annotation;
public@interfaceAnnotation {
String value();
}
Java代碼
publicclassAnnotationTest {
@NewAnnotation("main method")
publicstaticvoidmain(String[] args) {
saying();
}
@NewAnnotation(value = "say method")
publicstaticvoidsaying() {
}
}
定義一個枚舉類型,然後將參數設定為該枚舉類型,並賦予默認值
public@interfaceGreeting {
publicenum
FontColor {
BLUE,RED,GREEN
};
String name();
FontColor fontColor()defaultFontColor.RED;
}
這裡有兩種選擇,其實變數也就是在賦予默認值的參數上,我們可以選擇使用該默認值,也可以重新設定一個值來替換默認值
Java代碼
publicclassAnnotationTest {
@NewAnnotation("main method")
publicstaticvoidmain(String[] args) {
saying();
sayHelloWithDefaultFontColor();
sayHelloWithRedFontColor();
}
@NewAnnotation("say method")
publicstaticvoidsaying() {
}
// 此時的fontColor為默認的RED
@Greeting(name = "defaultfontcolor")
publicstaticvoidsayHelloWithDefaultFontColor() {
}
@Greeting(name = "notdefault", fontColor = Greeting.FontColor.BLUE)
publicstaticvoidsayHelloWithRedFontColor() {
}
高級套用
1.1. 限制註解的使用範圍
用@Target指定ElementType屬性
Java代碼(jdk)
packagejava.lang.annotation;
public enum ElementType {
TYPE,
// 用於類,接口,枚舉但不能是註解
FIELD,
METHOD,
PARAMETER,
// 方法的參數
CONSTRUCTOR,
//構造方法
LOCAL_VARIABLE,
// 本地變數或catch語句
ANNOTATION_TYPE,
// 註解類型(無數據)
PACKAGE
// Java包
}
1.2. 註解保持性策略
Java代碼
//限制註解使用範圍
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR})
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
在Java
編譯器編譯時,它會識別在
原始碼里添加的註解是否還會保留,這就是RetentionPolicy。下面是Java定義的RetentionPolicy枚舉:
編譯器的處理有三種策略:
將註解保留在編譯後的類檔案中,並在第一次載入類時讀取它
將註解保留在編譯後的類檔案中,但是在運行時忽略它
按照規定使用註解,但是並不將它保留到編譯後的類檔案中
Java代碼
packagejava.lang.annotation;
public enum RetentionPolicy{
SOURCE,
CLASS,
// 此類型註解會保留在class檔案中,但JVM會忽略它
RUNTIME
// 此類型註解會保留在class檔案中,JVM會讀取它
}
Java代碼
//讓保持性策略為運行時態,即將註解編碼到class檔案中,讓
虛擬機讀取
@Retention(RetentionPolicy.RUNTIME)
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
1.3. 文檔化功能
Java提供的Documented元註解跟Javadoc的作用是差不多的,其實它存在的好處是開發人員可以定製Javadoc不支持的文檔屬性,並在開發中套用。它的使用跟前兩個也是一樣的,簡單代碼示例如下:
Java代碼
//讓它定製文檔化功能
//使用此註解時必須設定RetentionPolicy為RUNTIME
@Documented
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
1.4. 標註繼承
Java代碼
//讓它允許繼承,可作用到子類
@Inherited
public @interface Greeting {
//使用枚舉類型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
2. 讀取註解信息
屬於重點,在系統中用到註解許可權時非常有用,可以精確控制許可權的粒度
注意:要想使用反射去讀取註解,必須將Retention的值選為Runtime
Java代碼
packagecom.iwtxokhtd.annotation;
importjava.lang.annotation.Annotation;
importjava.lang.reflect.Method;
//讀取註解信息
publicclassReadAnnotationInfoTest {
publicstaticvoidmain(String[] args)throws Exception {
// 測試AnnotationTest類,得到此類的類對象
Class c = Class.forName("com.iwtxokhtd.annotation.AnnotationTest");
// 獲取該類所有聲明的方法
Method[] methods =c.getDeclaredMethods();
// 聲明註解集合
Annotation[] annotations;
// 遍歷所有的方法得到各方法上面的註解信息
for(Method method : methods) {
// 獲取每個方法上面所聲明的所有註解信息
annotations =method.getDeclaredAnnotations();
// 再遍歷所有的註解,列印其基本信息
System.out.println(method.getName());
for(Annotation an :annotations) {
System.out.println("方法名為:" + method.getName()+ " 其上面的註解為:"
+an.annotationType().getSimpleName());
Method[] meths =an.annotationType().getDeclaredMethods();
// 遍歷每個註解的所有變數
for(Method meth :meths) {
System.out.println("註解的變數名為:" + meth.getName
註解注釋
注釋有三種:// /* */ /** */ 前兩種編譯器直接跳過,從來不閱讀,第三種編譯器是可以看懂的,當你使用javadoc這樣的命令時會用到,用來生成API時用的。
註解:這東東完全就是給編譯器看的。 比如@Ovrride表示這個方法是重寫了父類中的方法,而不是自定義的,所以這個時候編譯器會去檢查你的方法名是否和父類一樣,是否寫錯了。
以上是不同的概念