• 第九章:注解


    系列文章目录



    前言

    除了注释外注解也可以帮助我们编程。


    一、注解

    注解(Annotation)也被称为元数据(Metadata), 用于修饰解释 包、 类、 方法、 属性、 构造器、 局部变量等数据信息。

    注解
    和注释一样, 注解不影响程序逻辑, 但注解可以被编译或运行, 相当于嵌入在代码中的补充信息
    在 JavaSE 中, 注解的使用目的比较简单, 例如标记过时的功能, 忽略警告等。 在 JavaEE 中注解占据了更重要的角色, 例如用来配置应用程序的任何切面, 代替 java EE 旧版中所遗留的繁冗代码和 XML 配置等

    使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用。 用于修饰它支持的程序元素。

    注解符号作用
    @Override限定某个方法, 是重写父类方法, 该注解只能用于方法
    @Deprecated用于表示某个程序元素(类, 方法等)已过时
    @SuppressWarnings抑制编译器警告

    1.1 @Override

    @override
    限定某个方法,是重写父类方法,只能用于方法
    //@Override源码
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }
    //@interface不是接口类,是注解类
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    public class Override_ {
    	public static void main(String[] args) 
    	{
    	}
    } 
    
    class Father{//父类
    	public void fly(){
    		System.out.println("Father fly...");
    	} 
    	public void say(){}
    }
    
    class Son extends Father {//子类
    	//老韩解读
    	//1. @Override 注解放在 fly 方法上, 表示子类的 fly 方法时重写了父类的 fly
    	//2. 这里如果没有写 @Override 还是重写了父类 fly
    	//3. 如果你写了@Override 注解, 编译器就会去检查该方法是否真的重写了父类的
    	// 方法, 如果的确重写了, 则编译通过, 如果没有构成重写, 则编译错误
    	//4. 看看 @Override 的定义
    	// 解读: 如果发现 @interface 表示一个注解类
    	/*
    		@Target(ElementType.METHOD)
    		@Retention(RetentionPolicy.SOURCE)
    		public @interface Override {
    		}
    	*/
    	
    	@Override //说明
    	public void fly() {
    		System.out.println("Son fly....");
    	} 
    	
    	@Override
    	public void say() {}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    @Override 使用说明
    @Override 表示指定重写父类的方法(从编译层面验证),如果父类没有fly方法则会报错
    如果不写@Override注解,而父类仍有public void fly(){},任然构成重写
    @Override只能修饰方法,不能修饰其他类、包、属性等
    查看@Override注解源码为 @Target(ElementType.METHOD),说明只能修饰方法
    @Target 是修饰注解的注解,称为元注解

    1.2 @Deprecated

    @Deprecated
    用于表示某个程序元素(类、方法等)已过时
    public class Deprecated_ {
    	public static void main(String[] args) {
    		A a = new A();
    		a.hi();
    		System.out.println(a.n1);
    	}
    }
    	//1. @Deprecated 修饰某个元素, 表示该元素已经过时
    	//2. 即不在推荐使用, 但是仍然可以使用
    	//3. 查看 @Deprecated 注解类的源码
    	//4. 可以修饰方法, 类, 字段, 包, 参数 等等
    	//5. @Deprecated 可以做版本升级过渡使用
    	/*
    	@Documented
    	@Retention(RetentionPolicy.RUNTIME)
    	@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
    	public @interface Deprecated {
    	}
    	*/
    @Deprecated
    class A {
    	@Deprecated
    	public int n1 = 10;
    	@Deprecated
    	public void hi(){
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    @Deprecated说明
    用于表示某个程序元素(类、方法等)已过时
    可以修饰方法、类、字段、包、参数等等
    @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
    @Deprecated的作用可以做到新旧版本的兼容和过渡

    1.3 @SuppressWarnings

    @SuppressWarnings
    抑制编译器警告
    
    import java.util.ArrayList;
    import java.util.List;
    
    @SuppressWarnings({"rawtypes", "unchecked", "unused"})
    public class SuppressWarnings_ {
    	//老韩解读
    	//1. 当我们不希望看到这些警告的时候, 可以使用 SuppressWarnings 注解来抑制警告信息
    	//2. 在{""} 中, 可以写入你希望抑制(不显示)警告信息
    	//3. 可以指定的警告类型有
    	// all, 抑制所有警告
    	// boxing, 抑制与封装/拆装作业相关的警告
    	// //cast, 抑制与强制转型作业相关的警告
    	// //dep-ann, 抑制与淘汰注释相关的警告
    	// //deprecation, 抑制与淘汰的相关警告
    	// //fallthrough, 抑制与 switch 陈述式中遗漏 break 相关的警告
    	// //finally, 抑制与未传回 finally 区块相关的警告
    	// //hiding, 抑制与隐藏变数的区域变数相关的警告
    	// //incomplete-switch, 抑制与 switch 陈述式(enum case)中遗漏项目相关的警告
    	// //javadoc, 抑制与 javadoc 相关的警告
    	// //nls, 抑制与非 nls 字串文字相关的警告
    	// //null, 抑制与空值分析相关的警告
    	// //rawtypes, 抑制与使用 raw 类型相关的警告
    	// //resource, 抑制与使用 Closeable 类型的资源相关的警告
    	// //restriction, 抑制与使用不建议或禁止参照相关的警告
    	// //serial, 抑制与可序列化的类别遗漏 serialVersionUID 栏位相关的警告
    	// //static-access, 抑制与静态存取不正确相关的警告
    	// //static-method, 抑制与可能宣告为 static 的方法相关的警告
    	// //super, 抑制与置换方法相关但不含 super 呼叫的警告
    	// //synthetic-access, 抑制与内部类别的存取未最佳化相关的警告
    	// //sync-override, 抑制因为置换同步方法而遗漏同步化的警告
    	// //unchecked, 抑制与未检查的作业相关的警告
    	// //unqualified-field-access, 抑制与栏位存取不合格相关的警告
    	// //unused, 抑制与未用的程式码及停用的程式码相关的警告
    	//4. 关于 SuppressWarnings 作用范围是和你放置的位置相关
    	// 比如 @SuppressWarnings 放置在 main 方法, 那么抑制警告的范围就是 main
    	// 通常我们可以放置具体的语句, 方法, 类.
    	//5. 看看 @SuppressWarnings 源码
    	//(1) 放置的位置就是 TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE
    	//(2) 该注解类有数组 String[] values() 设置一个数组比如 {"rawtypes", "unchecked", "unused"}
    	/*
    	@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    	@Retention(RetentionPolicy.SOURCE)
    	public @interface SuppressWarnings {
    	String[] value();
    	}
    	*/
    	public static void main(String[] args) {
    		List list = new ArrayList();
    		list.add("jack");
    		list.add("tom");
    		list.add("mary");
    		int i;
    		System.out.println(list.get(1));
    	} 
    
    	public void f1() {
    		// @SuppressWarnings({"rawtypes"})
    		List list = new ArrayList();
    		
    		list.add("jack");
    		list.add("tom");
    		list.add("mary");
    		// @SuppressWarnings({"unused"})
    		int i;
    		System.out.println(list.get(1));
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    @SuppressWarnings
    unchecked 是忽略没有检查的警告
    rawtypes 是忽略没有指定泛型的警告(传参时没有指定泛型的警告错误)
    unused是忽略没有使用某个变量的警告错误
    @SuppressWarnings 可以修饰的程序元素为查看@Target
    生成@SuppressWarnings时,不用背,直接点击左侧的黄色提示,就可以选择(注意可以指定生成的位置)

    二、元注解

    JDK 的元 Annotation 用于修饰其他 Annotation。元注解: 本身作用不大, 讲这个原因希望看源码时, 可以知道他是干什么。

    元注解作用
    Retention指定注解的作用范围, 三种 SOURCE,CLASS,RUNTIME
    Target指定注解可以在哪些地方使用
    Documented指定该注解是否会在 javadoc 体现
    Inherited子类会继承父类注解

    总结

    注解可以帮我们更好的理解程序。

  • 相关阅读:
    SpringCloud + SpringGateway 解决Get请求传参为特殊字符导致400无法通过网关转发的问题
    有谁知道这个3D模型是哪个封装吗,power6的封装实在是找不到
    RTC 技术的试金石:火山引擎视频会议场景技术实践
    【C++】哈希基础1
    美团2017年CodeM大赛-资格赛 NC13224 送外卖(记忆化搜索 or 预处理 dfs)
    DDD相关概念描述
    postgresql中控制符带来的数据错觉
    python中matrix()矩阵和array()数组(待完善)
    playwright 防止WebDriver 被检测 被网站识别为爬虫设置
    文本预处理库spaCy的基本使用(快速入门)
  • 原文地址:https://blog.csdn.net/yanyongfu523/article/details/134422823