第九章:注解

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、注解
    • 1.1 @Override
    • 1.2 @Deprecated
    • 1.3 @SuppressWarnings
  • 二、元注解
  • 总结


前言

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


一、注解

注解(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不是接口类,是注解类
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() {}
}
@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(){
	}
}
@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));
	}
}
@SuppressWarnings
unchecked 是忽略没有检查的警告
rawtypes 是忽略没有指定泛型的警告(传参时没有指定泛型的警告错误)
unused是忽略没有使用某个变量的警告错误
@SuppressWarnings 可以修饰的程序元素为查看@Target
生成@SuppressWarnings时,不用背,直接点击左侧的黄色提示,就可以选择(注意可以指定生成的位置)

二、元注解

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

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

总结

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

你可能感兴趣的:(#,Java面向对象编程高级知识,java)