在本教程中,我們將通過示例學(xué)習(xí)什么是注解,不同的Java注解以及如何使用它們。
Java注解是我們程序源代碼的元數(shù)據(jù)(有關(guān)數(shù)據(jù)的數(shù)據(jù))。
它們向編譯器提供關(guān)于程序的附加信息,但不是程序本身的一部分。這些注解不會影響已編譯程序的執(zhí)行。
注解以@開頭。其語法為:
@AnnotationName
讓我們以@Override注解為例。
@Override注解指定了已標(biāo)有此注解的方法重寫用同樣名稱的方法,返回類型和參數(shù)列表中的父類的方法。
重寫方法時,不是必須使用@Override。但是,如果我們使用它,編譯器會在重寫方法時,如果出現(xiàn)錯誤(比如錯誤的參數(shù)類型),就會給出一個錯誤。
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { @Override public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
輸出結(jié)果
I am a dog.
在此示例中,方法displayInfo()同時存在于父類Animal和子類中Dog。調(diào)用此方法時,將調(diào)用子類的方法,而不是超類中的方法。
注解也可以包括元素(成員/屬性/參數(shù))。
標(biāo)記注解不包含成員/元素。它僅用于標(biāo)記聲明。
其語法為:
@AnnotationName()
由于這些注解不包含元素,因此不需要括號。例如,
@Override
單個元素注解僅包含一個元素。
其語法為:
@AnnotationName(elementName = "elementValue")
如果只有一個元素,則習(xí)慣上將該元素命名為value。
@AnnotationName(value = "elementValue")
在這種情況下,也可以移除元素名稱。元素名稱value默認(rèn)為。
@AnnotationName("elementValue")
這些注解包含多個用逗號分隔的元素。
其語法為:
@AnnotationName(element1 = "value1", element2 = "value2")
任何聲明都可以通過將其放在聲明上面來標(biāo)記注解。從Java 8開始,注釋也可以放在類型之前。
如上所述,Java注釋可以放在類,方法,接口,字段和其他程序元素聲明的上方。
import java.util.*; class Main { @SuppressWarnings("unchecked") static void wordsList() { ArrayList wordList = new ArrayList<>(); //這將導(dǎo)致未經(jīng)檢查的警告 wordList.add("nhooo"); System.out.println("Word list => " + wordList); } public static void main(String args[]) { wordsList(); } }
輸出結(jié)果
Word list => [nhooo]
如果上述程序在不使用@SuppressWarnings("unchecked")注解的情況下進行編譯,則編譯器仍將編譯該程序,但會給出如下警告:
Main.java uses unchecked or unsafe operations. Word list => [nhooo]
我們收到警告
Main.java uses unchecked or unsafe operations
因為下面的語句。
ArrayList wordList = new ArrayList<>();
這是因為我們尚未定義數(shù)組列表的通用類型。 我們可以通過在尖括號<>中指定泛型來解決此警告。
ArrayList<String> wordList = new ArrayList<>();
在Java 8之前,注釋只能應(yīng)用于聲明?,F(xiàn)在,也可以使用類型注釋。這意味著我們可以在使用類型的任何地方放置注解。
構(gòu)造函數(shù)調(diào)用
new @Readonly ArrayList<>()
類型定義
@NonNull String str;
此聲明指定String類型的非空變量str,以避免NullPointerException。
@NonNull List<String> newList;
該聲明指定String類型的非空列表。
List<@NonNull String> newList;
該聲明指定String類型的非空值的列表。
類型轉(zhuǎn)換newStr = (@NonNull String) str;
extends 和 implements 子句
class Warning extends @Localized Message
throws 子句
public String readMethod() throws @Localized IOException
類型注釋使Java代碼可以得到更好的分析,并提供更強大的類型檢查。
1. 預(yù)定義的注解
@Deprecated
@Override
@SuppressWarnings
@SafeVarargs
@FunctionalInterface
2. 元注解
@Retention
@Documented
@Target
@Inherited
@Repeatable
3. 自定義注解
這些注釋類型在Java 注解類型教程中有詳細(xì)描述。
編譯器指令 - 可用于向編譯器提供指令,檢測錯誤或禁止警告。 如內(nèi)置的注解@Deprecated,@Override, @SuppressWarnings。
編譯時指令 - 這些批注提供的編譯時指令幫助軟件構(gòu)建工具生成代碼,XML文件等。
運行時指令 - 可以定義一些注解以在運行時向程序提供指令。這些注解是使用Java 反射訪問的。