文档注释及Annotation类文档注释

java 做扫雷 java扫雷源代码加注解_javad

在我们文章初期我们只讲了两种注释方式:第一种是单行注释//,第二种是多行注释/**/。其实还有第三种——文档注释。那这个文档注释是怎么回事呢?我们还是先看看下面这张图:

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_02

我们可以看到在调用一些JDK自带类的方法的时候当选中某一个方法的时候会出现一个这个方法的提示框。而我们自己写的方法却没有:

java 做扫雷 java扫雷源代码加注解_元注解_03

那么这是为什么呢?我们可以看一下String类的isEmpty方法的源代码:

java 做扫雷 java扫雷源代码加注解_javad_04

可以发现刚才isEmpty显示的提示框里的内容和源代码上面的那些注释几乎一样。在这里,被/**和*/围成的内容就是文档注释了文档注释主要用在方法上文档注释的主要作用之一就是可以使使用者在调用的时候明白这个方法的一些详细信息。另一方面就是用javadoc生成API帮助文档的时候可以将这些信息存到文档里面。现在,我们就一一验证这两个作用。

java 做扫雷 java扫雷源代码加注解_文档注释_05

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_06

可以看到我们在Cat的move方法上写上文档注释,以后我们调用这个方法的时候就可以出现相应的提示了。不过需要注意一点,如果把Cat类和Test类写在同一个.java文件中,是不会出现提示的:

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_07

接下来看第二个作用了。如果是一路看过来的读者不知你们是否还记得我们在Java之学习初步的时候不止讲了javac和java命令,还有一个javadoc的命令,这个命令就是可以用来生成API文档的。比如我有一个Tools类:

java 做扫雷 java扫雷源代码加注解_javad_08

然后用cmd窗口输入以下内容:

java 做扫雷 java扫雷源代码加注解_元注解_09

命令执行成功后,会生成一堆文件,我们只需要打开index.html文件就行,里面就是我们这个类的API帮助文档了。对于这个命令生成的一大堆文件,里面都是息息相关的,最好不要随便删。(到后期学web前端的时候相信读者就能看得懂这些了)。有的读者看到上面的文档注释有什么@符号的,有点懵,这种其实是javadoc标签,作者从菜鸟教程中截图一张标签图:

java 做扫雷 java扫雷源代码加注解_javad_10

对照看就能知道上面的@link、@param、@return等常见标签的作用了。而不会写这种也没事,我们可以用开发工具先把方法写完,之后用快捷键/**+回车的方法就可以自动生成对应的文档注释:

java 做扫雷 java扫雷源代码加注解_java 做扫雷_11

而对于我们使用window的cmd的javadoc的命令时我们需要注意的是window里是采用GBK的编码格式,如果你的.java文件是用UTF-8的编码格式的话那么就生成不了API文档了。而改单个文件的编码格式我们可以右击这个文件:

java 做扫雷 java扫雷源代码加注解_java 做扫雷_12

选择Properties:

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_13

可以看到Text file encoding的框里我们可以选择。这里作者之前有改动所以默认就是UTF-8的形式。不然eclipse没做改动默认是GBK。如果是UTF-8的格式可以在Other中选择GBK。这样我们用javadoc的时候就能成功生成API文档了。(UTF-8的中文转换为GBK的中文经常乱码,所以一般先改成GBK,之后才写中文注释)

Annotation类


java 做扫雷 java扫雷源代码加注解_javad

相信读者之前在编写代码的时候用一些辅助开发工具生成一些需要重写如toString、equals等方法的时候会看到这样的标识:@Override

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_15

那么这到底是什么东西呢?是和上面的@一样,是javadoc的标签嘛?其实不是。这其实是JDK5的新特性——Annotation,也就是注解。我们按住ctrl然后点击那个@Override,会进去@Override的源代码:

java 做扫雷 java扫雷源代码加注解_javad_16

可以看到这种注解的代码格式是:

修饰符 @interface 注解名 {}

这里的@interface可不是声明为接口,而是声明为注解。注解也是一种引用数据类型。那么注解的主要作用是在干什么呢?其实作者感觉不用说太多,注解其实起着一种标记的作用。而从以上我们可以知道注解的使用方式就是用@注解名,那可以在哪里使用呢?等下揭晓。而在注解中我们可以写哪些内容呢?主要就是写属性,注解中没有方法。而注解中的属性又和之前我们在类中定义的属性有点不一样,如果直接用之前的方式定义属性的话:

java 做扫雷 java扫雷源代码加注解_文档注释_17

编译器会报错,而修改的话只能使之变为常量,但常量对于注解来说没什么意义,因此,在注解中定义属性是使用一种类似方法的格式:(数据类型 属性名())

java 做扫雷 java扫雷源代码加注解_javad_18

别看它像方法,其实它是一个属性!!!对于这样的一个属性,需要在使用注解的时候附上相对应的值,否则会报错

java 做扫雷 java扫雷源代码加注解_java 做扫雷_19

我们需要用 @注解名(属性名=值,属性名=值...) 的格式对属性赋值才行。

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_20

是不是感觉有点神奇,更神奇的是:如果属性名是value,那么value=可以省略

java 做扫雷 java扫雷源代码加注解_javad_21

但是如果在一个注解写多个属性之后,每次使用都要赋值无疑是很麻烦的,这时候我们就可以在定义属性的格式后面加default 默认值这种方式,这样做的好处就是可以不用每次使用注解时都必须要对属性赋值

java 做扫雷 java扫雷源代码加注解_javad_22

在这里,需要注意的还有一点:对于属性是引用数据类型,其默认值不能为null

java 做扫雷 java扫雷源代码加注解_java 做扫雷_23

注解我们一般分为两种,一种是Java自带的注解。另一种是元注解。

元注解

什么是元注解呢?可以简单的理解为用来标记注解的注解就是元注解。一般分为Retention、Target、Inherited、Documented(JDK7之后陆续加了几个注解这里就不再解释说明了)。

Target


这个元注解主要是用来标记注解能够修饰哪些元素

java 做扫雷 java扫雷源代码加注解_javad_24

其属性是一个枚举类型的数组:

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_25

每个值大概在注解这边的解释如下(后面三个暂时不懂.):

java 做扫雷 java扫雷源代码加注解_文档注释_26

因此假如我在MyAnno中加入如下的Target(Target的属性名是value,所以value=可以省略):

java 做扫雷 java扫雷源代码加注解_java 做扫雷_27

那么我的这个注解就只能修饰方法了,想修饰成员变量就需要变成如下:

java 做扫雷 java扫雷源代码加注解_文档注释_28

到这,相信读者就知道了注解能够在哪里使用了。

Retention


这个元注解主要用来标记注解最终保存到哪里

java 做扫雷 java扫雷源代码加注解_文档注释_29

其属性是一个枚举类:

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_30

有三个值,其大致意思如下:

java 做扫雷 java扫雷源代码加注解_javad_31

所以如果我在MyAnno注解中加入如下Retention(一样的value可以省略):

java 做扫雷 java扫雷源代码加注解_java 做扫雷_32

那么Test类中的那些注解在编译的时候就会被遗弃,在.class文件中是找不到这个注解的。

Inherited


这个元注解主要用来标记注解可以被子类继承

java 做扫雷 java扫雷源代码加注解_javad_33

注意这个继承不是说注解去继承注解,而是说一个父类的注解可以继承到子类上。注解本身是不能被继承的

java 做扫雷 java扫雷源代码加注解_javad_34

因为注解本身不算是一个class。Documented

这个元注解主要标记注解是否在javadoc中生成

java 做扫雷 java扫雷源代码加注解_javad_35

比如下面要讲的java自带的注解之一:Deprecated,它上面就有元注解Documented,所以我们有时候看API文档时提示已过时就是因为它。

到这里元注解基本讲完了,读者可以回头看看元注解上面的元注解表示的是什么。来加强记忆。

Java自带的注解

对于Java自带的注解,其位于java.lang包下。主要有以下三个:Deprecated、Override、SuppressWarning。接下来,我们一个一个看:

Deprecated

之前我们在介绍Java的包装类的时候使用Integer的一个构造方法的时候出现了一条横线:

java 做扫雷 java扫雷源代码加注解_javad_36

那时候我们简要说明了这表示已过时而已,现在我们就进入这个构造方法看个明白:

java 做扫雷 java扫雷源代码加注解_javad_37

可以看到这个构造方法加了Deprecated,而Deprecated用来表明这个元素已过时的

java 做扫雷 java扫雷源代码加注解_java 做扫雷_38

里面有两个属性一个是since,用来表示在哪个版本中被遗弃。另一个forRemoval用来表示被注解的元素是否在将来的版本被移除。

Override

java 做扫雷 java扫雷源代码加注解_javad_39

可以看出Override是辅助编译器判断是否成功覆盖方法,如果不成功就会报错:

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_40

java 做扫雷 java扫雷源代码加注解_元注解_41

所以在重写的时候我们一般都会写上Override的注解。

SuppressWarning

这个注解主要是来标记要忽略的警告

java 做扫雷 java扫雷源代码加注解_文档注释_42

不知读者在写代码时是不是经常看到黄色的波浪线,这其实就是警告了:

java 做扫雷 java扫雷源代码加注解_文档注释_43

可以看到我们可以添加相应的SuppressWarnings注解来忽略此警告:

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_44

而对于不同的情况,有着不同的值,其中,作者在网上找了一张图:

java 做扫雷 java扫雷源代码加注解_java 做扫雷_45

大概知道下即可。

到这,JAVA SE就剩下IO流、线程、反射这三部分内容了,为了下次的IO流,这里接下去讲解一个Java需要了解的类。

File类


这个类位于java.io下,我们看名称也可以大致猜想它是可以读取我们本地文件的一个类,但API文档对它的解释是:文件和目录路径名的抽象表示形式

构造方法

java 做扫雷 java扫雷源代码加注解_javad_46

常用的是第二个,或第四个。

常用方法

java 做扫雷 java扫雷源代码加注解_java 做扫雷_47

创建指定文件

java 做扫雷 java扫雷源代码加注解_java 做扫雷_48

删除指定文件或目录

java 做扫雷 java扫雷源代码加注解_文档注释_49

判断指定文件或目录是否存在

java 做扫雷 java扫雷源代码加注解_元注解_50

获取指定文件或目录的绝对路径(cmd入门须知的基操中有解释绝对路径)

java 做扫雷 java扫雷源代码加注解_javad_51

获取指定文件或目录的名称

java 做扫雷 java扫雷源代码加注解_javad_52

返回指定文件或目录的上级目录

java 做扫雷 java扫雷源代码加注解_元注解_53

判断指定的文件或目录是否为绝对路径、目录、文件、隐藏文件

java 做扫雷 java扫雷源代码加注解_元注解_54

返回指定的文件被修改时间

java 做扫雷 java扫雷源代码加注解_文档注释_55

返回文件的字节大小

java 做扫雷 java扫雷源代码加注解_javad_56

该方法的File对象应该指定一个目录,不能是文件

java 做扫雷 java扫雷源代码加注解_java 做扫雷_57

创建指定目录

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_58

将指定文件或目录转换为URL格式。(什么是URL呢?URL是统一资源定位器,可以理解为网络上某个资源的绝对路径。)

这里常用方法就不再演示了,只说明一点:

java 做扫雷 java扫雷源代码加注解_java扫雷源代码加注解_59

路径的分隔符可以写成上面的三种形式,其中\\表示转义字符\

java 做扫雷 java扫雷源代码加注解_元注解_54