本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、什么是注解
注解以@开头,比如最常见的@Override,lombok中的@Data等等,它的作用是对程序做出解释,并且这种解释可以被编译器等程序读取。
二、java内置注解
我首先想要介绍一下java内置的三种注解,你可以使用它们来帮助你提高开发效率。
1.@Override
我相信所有学习过java基础的人都曾经使用过这个注解,它的作用是帮助你检查当前是否在覆写父类中的方法。如果父类中没有一个a方法,那么子类中在a方法上增加@Override注解就会报错。
我曾经的一次期末考试中出过一道选择题,其中一个选项是,如果不增加@Override注解,是否会影响你覆写父类的方法。答案是不会有影响,你可以正常地覆写父类中的方法。@Overide的作用只是为你检查是否在覆写一个父类中存在的方法,如果你不需要编译器检查,那么不用也无妨。
class A{
public void method1()
{
System.out.println("method of A!");
}
}
class B extends A{
@Override//加不加Override都可以
public void method1(){
System.out.println("method of B!");
}
}
public class LearnAnnotation {
public static void main(String[] args) {
A a=new B();
a.method1();
}
}
2.@Deprecated
这个注解用来标记那些过时,但是仍然可用的方法。你在使用这些方法时,它的名字会被一条横线分割。如果你在copy前人的代码时遇到了这种情况,可以尝试用当前更推荐的方法来替换它。
class A{
@Deprecated
public void method1()
{
System.out.println("method of A!");
}
}
public class LearnAnnotation {
public static void main(String[] args) {
A a=new A();
a.method1();//这里的方法看起来被划掉了,这意味这方法过时,但是仍然会起作用
//在这里你看不到被划掉,需要复制代码到你的编译器(比如idea)中才能观察到
}
}
3.@SuppressWarnings
这个注解有许多参数,我不会做过多的介绍,它的作用就是屏蔽掉某些类型的警告。如果你暂时不想处理你的代码中的某些异常,可以去搜索这个注解的详细介绍。
三、自定义注解
自定义注解类似于创建一个接口,为了区分,将其声明为@interface。
@interface myAnnotation{
}
@myAnnotation
public class LearnAnnotation {
@myAnnotation
public static void main(String[] args) {
}
}
这里是一个没有实际意义的注解,它现在仅仅能够被识别为是一个注解,把它加在类上或者方法上都不会起任何作用(但是合法)。
下一步我们可以为其指定作用域,使用@Target注解,需要传入一个参数数组,数组中可以指定一个或多个作用域。
@Target(value={ElementType.METHOD,ElementType.TYPE})//作用域为方法和类
@interface myAnnotation{
}
@myAnnotation
public class LearnAnnotation {
@myAnnotation
public static void main(String[] args) {
}
}
在你的开发环境中打出ElementType,它会提示出其他作用域,你可以仿造上面的demo来测试它们的实际意义。
接下来是给自定义注解指定一些参数,参数必须要有值,你可以在使用注解时为它赋值,或者给它指定一个默认值,否则程序将会报错,看看下面这个demo
@Target(value={ElementType.METHOD,ElementType.TYPE})
@interface myAnnotation{
String param1();//就像普通的类中定义参数————但是末尾增加一个括号
int param2() default 1;
}
@myAnnotation(param1 = "abc",param2 = 0)//这里的参数名和定义的必须一致
public class LearnAnnotation {
@myAnnotation(param1="123")
public static void main(String[] args) {
}
}
param1没有默认值,所以使用注解两处都为它赋值了一个字符串型(这也是在注解中定义好的)。param2有默认值,你可以为它赋予一个新值或者让它保持缺省。
有一种特殊情况是,如果注解中只要求一个参数,并且那个参数名为value,那么在使用注解时可以不指定它的名字(你不需要特意记忆这个,只需要能遇到这种情况时能看懂即可),就像下面这个demo这样。
@Target(value={ElementType.METHOD,ElementType.TYPE})
@interface myAnnotation{
String value();
}
@myAnnotation("abc")
public class LearnAnnotation {
@myAnnotation("123")
public static void main(String[] args) {
}
}
好了,以上这些就是注解的基本内容。之前字节面试时我被问到了如何自定义一个注解,以及注解是如何起作用的,相信看到这里的你已经能够回答前一个问题了。第二个问题的答案,以及注解中的参数起到了什么作用,我会在下一节关于反射的介绍中补充。