一、枚举类概述
1.在某些情况下,一个类的对象是有限而且固定的。例如季节类,只能有春夏秋冬四个对象。
2.手动实现枚举类:
①private修饰构造器
②属性使用private final修饰
③把该类的所有实例都使用public static final来修饰
二、使用enum定义枚举类
1.JDK1.5新增的enum关键字用于定义枚举类。
2.枚举类和普通类的区别:
①使用enum定义的枚举类默认继承了 java.lang.Enum类。
②枚举类的构造器只能使用private访问控制符。
③枚举类的所有实例必须在枚举类中显式列出(,分隔 ;结尾).列出的实例系统会自动添加public static final 修饰。
④所有的枚举类都提供了一个values方法,该方法可以很方便的遍历所有的枚举类。
3.JDK1.5中可以在switch表达式中使用枚举类的对象作为表达式,case子句可以直接使用枚举值的名字,无需添加枚举类作为限定。
4.若枚举只有一个成员,则可以作为一种单例模式的实现方式。
三、实现接口的枚举类
1.和普通java类一样枚举类可以实现一个或多个接口。
2.若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法。
package day13; public class Test3 { public static void main(String[] args){ //Season.SPRING,这段执行就是获取一个Season的对象 Season spring = Season.SPRING; spring.showInfo(); Season summer = Season.SUMMER; summer.showInfo(); Season autumn = Season.AUTUMN; autumn.showInfo(); Season winter = Season.WINTER; winter.showInfo(); Season spring1 = Season.SPRING;//每次执行Season.SPRING获得的是相同的对象,说明枚举类中的每个枚举都是单例模式 System.out.println(spring.equals(spring1)); spring1.test(); } } enum Season implements ITest{ SPRING("春天","春暖花开"),//此处相当于在调用有参的私有构造private Season(String name,String desc) SUMMER("夏天","炎炎夏日"), AUTUMN("秋天","秋高气爽"), WINTER("冬天","寒风刺骨"); private final String name; private final String desc; private Season(String name,String desc){ this.name = name; this.desc = desc; } public void showInfo(){ System.out.println(this.name + ":" + this.desc); } public void test() { // TODO Auto-generated method stub System.out.println("这是实现的ITest接口的test方法"); } } interface ITest{ void test(); }
打印结果为:
四、Annotation(注释)概述
1.从JDK5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注释)。
2.Annotation其实就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
3.Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的“name = value”对中。
4.Annotation能被用来为程序元素(类、方法、成员变量等)设置元数据。
五、基本的Annotation
1.使用Annotation时要在其前面加@符号,并把该Annotationd当成一个修饰符使用,用于修饰它支持的程序元素。
2.三个基本的Annotation
①@oOverride:限定重写父类方法,该注释只能用于方法。
②@Deprecated:用于表示某个程序元素(类、方法等)已过时。
③@SuppressWarnings:抑制编译器警告。
六、自定义Annotation
1.定义新的Annotation类型使用@interface关键字。
2.Annotation的成员变量在Annotation定义中以无参数方法的形式来声明,其方法名和返回值定义了该成员的名字和类型。
3.可以在定义Annotation的成员变量时为其指定初始值,指定成员变量的初始值可以使用default关键字。
4.没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation。
package day13; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.ArrayList; import java.util.List; public class Test4 { public static void main(String[] args){ new TestB().test1(); @SuppressWarnings({ "rawtypes", "unused" }) List list = new ArrayList(); } } class TestA{ public void test(){ } } class TestB extends TestA{ @TestAnn(id = 100,desc = "姓名") String name; @Override public void test() { // TODO Auto-generated method stub super.test(); } @Deprecated public void test1(){ } } @Target(ElementType.FIELD)//这个注解类是给其它类的属性做注解 @Retention(RetentionPolicy.RUNTIME)//定义注解的生命周期 @Documented//注解放到doc文档中 @interface TestAnn{ public int id() default 0; public String desc() default ""; }
注解暂时作为了解,普通开发用不到,做开源项目之类的可能会用到。
深入了解需要学习注解Annotation实现原理与自定义注释的一些例子。