typora-root-url: imgs
typora-copy-images-to: imgs

JavaSE.07.枚举及注解

1.枚举

java枚举翻译demo java枚举注释_枚举类

1.枚举的使用
一.枚举类的使用
1.枚举类的理解:类的对象只有有限个,确定的。称为枚举类
2.当需要定义一组常量时,建议使用枚举类
3.如果枚举类中只有一个对象,则可以作为单例模式的实现功能

二.如何定义枚举类
方式一.jdk5.0之前,自定义枚举类
方式二.jdk5.0,可以使用enum关键字定义枚举类
public class SeasonTest {
	public static void main(String[] args) {
		new SeasonTest().test(Season.AUTUMN);
	}
	
	
	public void test(Season sea) {
		System.out.println(sea);
	}
}

class Season{
	//1.声明Season对象的属性:private final 修饰
	private final String seasonName;
	private final String seasonDesc;
	
	//2.私有化构造器
	private Season(String seasonName,String seasonDesc) {
		this.seasonName = seasonName;
		this.seasonDesc = seasonDesc;
	}
	
	//3.提供当前枚举类的多个对象
	public static final Season SPRING = new Season("春天","春天来了");
	public static final Season SUMMER = new Season("夏天","夏日炎炎");
	public static final Season AUTUMN = new Season("秋天","秋高气爽");
	public static final Season WINTER = new Season("冬天","冰天雪地");

	//4.其他诉求1:获取枚举类对象的属性
	public String getSeasonName() {
		return seasonName;
	}
	public String getSeasonDesc() {
		return seasonDesc;
	}
	
	
	//5.其他诉求2:提供toString
	@Override
	public String toString() {
		return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
	}
}
使用enum关键字定义枚举类
说明:定义枚举类默认继承于class java.lang.Enum类

三,enum类的常用方法
		values()
		valuesOf(String objName)
		toString()

四.enum类实现接口的情况
		情况一:实现接口在enum类中实现抽象方法
		情况二:让枚举类的对象分别实现接口中的抽象方法
public class EnumTest1 {
	public static void main(String[] args) {
		Season1 summer = Season1.SUMMER;
		//toString()
		System.out.println(summer.toString());//SUMMER
		
//		System.out.println(Season1.class.getSuperclass());//class java.lang.Enum
		
		//values():返回枚举类型的对象数组,该方法可以很方便的遍历所有的枚举值
		Season1[] values = Season1.values();
		for (int i = 0;i < values.length; i++) {
			System.out.println(values[i]);//SPRING SUMMER AUTUMN WINTER
		}
		
		//valuesOf(String objName):返回枚举类中对象名是objName的对象
		//如果没有找到objName对象,则抛出异常
		Season1 valueOf = Season1.valueOf("WINTER");
		Season1 valueOf1 = Season1.valueOf("WINTER1");//java.lang.IllegalArgumentException
		System.out.println(valueOf);//WINTER
		
		summer.show();
	}
	
	
	public void test(Season sea) {
		System.out.println(sea);
	}
}

interface Info{
	void show();
}

enum Season1 implements Info{
	
	//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾使用";"
	//情况二:
		SPRING("春天","春天来了"){

			@Override
			public void show() {
				System.out.println("春天");
			}
			
		},
		SUMMER("夏天","夏日炎炎"){

			@Override
			public void show() {
				System.out.println("夏天");
			}
			
		},
		AUTUMN("秋天","秋高气爽"){

			@Override
			public void show() {
				System.out.println("秋天");
			}
			
		},
		WINTER("冬天","冰天雪地"){

			@Override
			public void show() {
				System.out.println("冬天");
			}
			
		};
	
	//1.声明Season对象的属性:private final 修饰
	private final String seasonName;
	private final String seasonDesc;
	
	//2.私有化构造器
	private Season1(String seasonName,String seasonDesc) {
		this.seasonName = seasonName;
		this.seasonDesc = seasonDesc;
	}
	
	//4.其他诉求1:获取枚举类对象的属性
	public String getSeasonName() {
		return seasonName;
	}
	public String getSeasonDesc() {
		return seasonDesc;
	}

//	@Override
//	public void show() {//情况一
//		System.out.println("这是一个季节");
//		
//	}
	
	
}

2.注解

注解:
一定程度上:框架 = 注解 + 反射 + 设计模式

1.使用:
①.jdk5.0新增
②.代码的特殊标记,可以在编译,类加载,运行时被读取
③.用来配置应用程序中的任何切面,代替繁琐的代码和XML配置文件等

2.Annotation的使用事例
事例一.生成文档的相关注解
事例二.在编译时进行格式检查(JDK内置的三个基本注解)
	@Override:限定重写父类方法,只能用于方法
	@Deprecated:用于表示所修饰的元素已经过时。通常是因为所修饰的结构危险或存在更好的选择
		@Deprecated
		public Date(int year, int month, int day) {
     	super(year, month, day);
  	}
	@SupperessWarnings:抑制编译器警告
 	@SuppressWarnings("unused")
		int num = 1;
 
事例三.跟踪代码依赖性,实现替代配置文件功能

3.如何自定义注解
		①.注解声明为:@interface
		②.内部定义成员变量,通常使用value表示
		③.可以指定成员的默认值,使用default定义
		④.如果自定义注解没有成员变量,表明是一个标识作用

4.元注解:用于修饰其他Annotation定义
		①.@Target(ElementType.METHOD):指定该注解可以使用的范围
		②.@Retention(RetentionPolicy.SOURCE):指定该注解的生命周期
				 CLASS:class文件中有效,运行时丢弃(默认的)
				 RUNTIME:解释运行加载到内存中,可以通过反射得到
				 SOURCE:源文件有效,编译时丢弃
			public @interface Override {
			}
		③.@Documented:该注解可以被javadoc工具提取文档
			@Documented
			@Retention(RetentionPolicy.RUNTIME)
			@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
			public @interface Deprecated {
			}
		④.@Inherited:修饰的注解具有继承性,子类可以继承父类的注解
5.通过反射获取注解信息
		Class claszz = new Student.class;
		Annotation[] ann = clazz.getAnnotations();
		for(int i = 0 ;i < ann.length;i++){
			System.out.println(ann[i]);
		}

6.jdk8中的新特性:可重复注解,类型注解
		可重复注解:实现①		@Repeatable(AnnotationsMy.class)
						public @interface AnnotationMy {
							String value() default "bbb";
						}
						
						public @interface AnnotationsMy {
							AnnotationMy[] value();
						}
						注:必须保证两个注解的元注解相同
 		类型注解:@Target  ElementType
public class AnnotationTest {
	public static void main(String[] args) {
		@SuppressWarnings("unused")
		int num = 1;
	}
}

class Generic<@AnnotationMy T>{
	
}

@AnnotationMy(value = "aaa")
class Person{
	String name;
	int age;
	public Person() {
		super();
	}
	public void show(){
		System.out.println("父类的show方法");
	}
}
//@AnnotationsMy({@AnnotationMy(value = "aaa"),@AnnotationMy(value = "ccc")}):jdk8之前
@AnnotationMy(value = "aaa")
@AnnotationMy(value = "bbb")
class Student extends Person{
	@Override
	public void show() {
		System.out.println("子类的show方法");
	}
}
@Repeatable(AnnotationsMy.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_PARAMETER,ElementType.METHOD,ElementType.TYPE,ElementType.LOCAL_VARIABLE})
public @interface AnnotationMy {
	String value() default "bbb";
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_PARAMETER,ElementType.METHOD,ElementType.TYPE,ElementType.LOCAL_VARIABLE})
public @interface AnnotationsMy {
	AnnotationMy[] value();
}