什么是注解?注解和注释有什么区别?
说到注解大家肯定不陌生,在学习这个之前,很多人(包括我)都会把注解和注释归为一类,但在java中并不是这样。先让我们看一下在编译器中这两个东西长啥样:
注释:
注解:
通俗来说,注释就是我们自己给代码写的解释,能够让我们更容易看懂代码的一种笔记,是给人看的。而注解是以“@”开头,给电脑看的一种标记,例如我们在重写toString方法的时候上方就会出现@Override这样的黄色标志。
注解的作用、使用位置
那么我们在能够区分注释和注解了以后,了解一下注解具体的作用
作用
1.不是程序本身,可以对程序作出解释(这一点和注释(comment)没什么区别)
2.可以被其他的程序(比如:编译器等)读取。
其实看了这两句话的小伙伴一定会像我一样很困惑注解真正的用处好像就只是形容的模糊不清的第二点?? 但是其实我们学到后面的反射的时候我们就能体会到注解的具体作用,它可以作为反射动态编程的一个基石,我们可以通过注解反射来获取类、对象、方法的信息等等,这写在后面的反射博客上会再次结合实现,这一章我们先来认识一下注解以及注解的几种类型。
使用位置
注解可以附加在package、class、method、field等上面,相当于给他们加了额外的信息,我们可以通过反射机制动态的编程。
注解的分类
一、内置注解
@override:定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。
@Deprecated:定义在java.lang.Deprecated中,此注释可以用于修辞方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择。
@SuppressWarnings :定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息。与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的,我们选择性的使用就好。
以上这三个是我们比较常用,也比较重要的三个内置注解,前两个我们都很熟悉:
@override,我们在重写方法的时候,编译器都会让它自动生成。
@Deprecated,在我们查看java源码的时候比较常见,在我们调用了一些比较老的方法的时候经常能够看到,这个注解在定义了方法以后我们调用这个方法就会出现方法名上一横的效果。
@SuppressWarnings,我们没怎么使用过,它是用来镇压警告的作用,有时候我们需要它来镇压未检查的代码,镇压所有警告等等作用,具体我们在使用的时候可以根据自己的需要来传递参数,达到我们想要的效果,常用的有:
二、元注解
定义:元注解的作用就是负责注解其他注解,Java定义了4个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明。
我们可以尝试去看看@Override的源码:
我们发现,在定义@Override的时候,居然上面还有注解??而且都没有见过...给注解打注解,禁止套娃(bushi)。按照定义,它俩就是原注解,元注解的作用呢,就是用来定义注解的,比方说@Target是用来定义注解的使用范围(即:被描述的注解可以用在什么地方)这样多少也能理解元注解的作用了----用来定义其他注解!下面给出几种常用的元注解。
@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Retention:表示需要在什么级别保存该注释信息﹐用于描述注解的生命周期(SOURCE<CLASS < RUNTIME)
@Document:说明该注解将被包含在javadoc中
@lnherited:说明子类可以继承父类中的该注解
三、自定义注解
那么如何按照自己的需求定义一个注解呢?
使用@interface自定义注解,自动继承了自动继承了java.lang.annotation.Annotation接口。
需要注意的:
让我们自己写一个:
public class test03 {
//当只有一个属性的时候 可以省略属性名
@MyAnnotation("qwq")
public void test(){
}
}
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
String value();
}
那么今天java注解就先说到这里,希望对初学的你有所帮助!