初步认识注解

注解

声明

这篇文章参考的是(210条消息) 十分钟深度学习Java注解_何学长在奔跑的博客-CSDN博客这位大佬的博客,写这篇文章呢就是记录下自己的学习记录,加入个人理解。

什么是注解?

注解,也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。这看不懂没关系,先别管吗,看了后面大概就知道它是干嘛用的。

注解有哪些类型?

按作用分类:(我直接照搬)

  1. 编写文档:通过代码里标识的元数据生成文档

    1. 代码分析:通过代码里标识的元数据对代码进行分析

    2. 编译检查:过代码里标识的元数据让编译器能够实现基本的编译检查

根据注解参数分类

	1.  标记注解:没有参数的注解:,仅用自身的存在与否为程序提供信息,如@Override注解,该注解没有参数,用于表示当前方法为重写方法。
	2.  单值注解: 只有一个参数的注解,如果该参数的名字为value,那么可以省略参数名
	3.  完整注解: 有多个参数的注解。

内置注解

​ 顾名思义就是jdk内置的注解。

  • @Override

    标记在成员方法上,用于标识当前方法是重写父类(父接口)方法,编译器在对该方法进行编译时会检查是否符合重写规则,如果不符合,编译报错。

    什么意思呢?就是你如果重写父类的方法,哪么如果在前面标记了@Override哪么你这个重写方法就要复合重写规则。举个列子:

    @Verride //注解:说明接下来这个方法是重写父类的方法
    public String ToString(){
        return "dvhbd";
    }
    //如果这样写
    @Verride 
    public String ToStrings(){//注意名字多了个s哪么它就不满足重写规则,编译时就要报错
        return "dvhbd";
    }
    
  • @Deprecated

    用于标记当前类、成员变量、成员方法或者构造方法过时如果开发者调用了被标记为过时的方法,编译器在编译期进行警告。

    我的理解就是每个语言都会跟新,所以以前的方法现在有了更高效方法,哪么这个方法就过时了,人们不用他了,但是我们使用过程又不知道这个方法过时没有,所以官方就会对过时的方法标记,当我们调用时就会提醒我们。当然过时方法依然可以用。举个列子:
    在这里插入图片描述

    看见没编译器就会自己提示这个函数已经过时,然后给它画上一杠,但是这个函数依旧额可以以用。

    自己怎么用这个注解呢?

在这里插入图片描述

  • @SuppressWarnings

    压制警告注解,可放置在类和方法上,该注解的作用是阻止编译器发出某些警告信息,该注解为单值注解。(就一个参数)

    参数有:

    • unchecked:未检查的转化,如集合没有指定类型还添加元素
    • unused:未使用的变量
    • resource:有泛型未指定类型
    • path:在类路径,原文件路径中有不存在的路径
    • deprecation:使用了某些不赞成使用的类和方法
    • fallthrough:switch语句执行到底没有break关键字
    • rawtypes:没有写泛型,比如: List list = new ArrayList();
    • all:全部类型的警告

    简单的说就是只要在警告前标记它并且加入警告的参数,编译器就不会警告这个错误了。

在这里插入图片描述

加入注解后

在这里插入图片描述

ok,就是这么用到。

自定义注解

格式: public @Interface 注解名 {属性列表/无属性}

注意: 如果注解体中无任何属性,其本质就是标记注解。但是与其标注注解还少了上边修饰的元注解。

我直接代码:

//定义注解
public @interface my{//表准自定义注解格式
    /*属性的返回值类型必须是以下几种:
	基本数据类型,String类型,枚举类型,注解,以上类型的数组
	注意: 在这里不能有void的无返回值类型和以上类型以外的类型*/
    int num() default 5; //默认值为5
    String str();
}
//使用注解
@my(num=3,str="str")
//也可以为@my(str="str")
public class use{
    void add(){
        return 1;
    }
}
/*在使用时需要给注解中的属性赋值
	1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时可以不为属性赋值,它取的是默认值。如果为它再次传入值,那么就发生了对原值的覆盖。
	2. 如果只有一个属性需要赋值,并且属性的名称为value,则赋值时value可以省略,可以直接定义值
数组赋值时,值使用{}存储值。如果数组中只有一个值,则可以省略{}
*/

元注解

元注解:元注解就是用来描述注解的注解。一般使用元注解来限制自定义注解的使用范围、生命周期等等。

我理解的是元注解可以修饰一般注解也可以修饰代码,一般注解修饰只能修饰代码,元注解可以修饰一般注解的使用范围,生命周期等。

元注解分类

  • @Target 指定被修饰的注解的作用范围。其作用范围可以在源码中找到参数值。

在这里插入图片描述

举个例:

@Target(ElementType.TYPE)//TYPE参数就代表这个参数是用于描述类,接口,或enum
public @interface my{
   //@Target(ElementType.TYPE)在这标记就会报错因为它是修饰类,接口,或enum的。
    int num();
    String str();
}
  • @Retention 指定了被修饰的注解的生命周期

在这里插入图片描述

举例:

@Retention(RetentionPolicy..RUNTIME)
//参数RetentionPolicy..RUNTIME表示注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
public @interface my{
    String str();
}
  • @Documented 指定了被修饰的注解是可以Javadoc等工具文档化

    它是一个标记注解(标记注解没有参数)。被该标记注解标记的注解,生成doc文档时,注解是可以被加载到文档中显示的。

  • @Inherited 指定了被修饰的注解修饰程序元素的时候是可以被子类继承的

    它是一个标记注解(标记注解没有参数)。

被修饰的注解是可以Javadoc等工具文档化

它是一个标记注解(标记注解没有参数)。被该标记注解标记的注解,生成doc文档时,注解是可以被加载到文档中显示的。

  • @Inherited 指定了被修饰的注解修饰程序元素的时候是可以被子类继承的

    它是一个标记注解(标记注解没有参数)。

最后

以前很少写博客,这是第二次写,可能比较杂乱无章,错误比较多,个人理解也可能是错的。看不下去就不要看了吧,看我推荐大佬写的博客吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值