步骤:
1.不需要提供setxxx方法,因为枚举对象的属性只需读。
2.对枚举对象使用 final + static修饰,实现底层优化。
3.枚举对象名通常全部使用大写,这是一个命名规范。
4.构造器私有化,但是对象向外暴露。
package Enum;publicclassDefineMyself{publicstaticvoidmain(String[] args){ System.out.println(Season.SPRING); System.out.println(Season.SUMMER);}}classSeason{private String name;private String weather;publicstatic final SeasonSPRING=newSeason("春天","温暖");publicstatic final SeasonSUMMER=newSeason("夏天","炎热");privateSeason(String name, String weather){this.name= name;this.weather= weather;}public StringgetName(){return name;}public StringgetWeather(){return weather;} @Overridepublic StringtoString(){return"Season{"+"name='"+ name+'\''+", weather='"+ weather+'\''+'}';}}
1.但我们使用enum关键字来创建一个枚举类时,默认会继承Enum类,同时该类使用了final修饰。
2.传统的 public static final Season SPRING = new Season(“春天”,“温暖”); 变成了SPRING(“春天”,“温暖”),我们要注意它调用的是哪一个构造器。
3.如果调用的是无参构造器创建的枚举对象,则实参列表和小括号都可以省略。
枚举对象必须放在枚举类的首行。
package Enum;publicclassDefineMyself{publicstaticvoidmain(String[] args){ System.out.println(Season.SPRING); System.out.println(Season.SUMMER);}}enum Season{SPRING("春天","温暖"),SUMMER("夏天","炎热");public String name;public String weather;privateSeason(String name, String weather){this.name= name;this.weather= weather;}public StringgetName(){return name;}public StringgetWeather(){return weather;} @Overridepublic StringtoString(){return"Season{"+"name='"+ name+'\''+", weather='"+ weather+'\''+'}';}}
注意使用enum关键字创建枚举类时对象依然有 static 和 final 修饰
values : 返回当前枚举类中的所有常量。返回的是一个数组。
classUntitled{publicstaticvoidmain(String[] args){ Season season= Season.SPRING; System.out.println(season.name()); System.out.println(season.ordinal());//输出0 Season[] seasons= Season.values();for(Season s1: seasons){ System.out.println(s1);//输出SPRING和SUMMER} Season value= Season.valueOf("SPRING"); System.out.println(value);//输出SPRING System.out.println(season.compareTo(Season.SUMMER));//0-1=-1,输出-1}}enum Season{SPRING("春天","温暖"),SUMMER("夏天","炎热");private String name;private String weather;privateSeason(String name,String weather){this.name= name;this.weather= weather;}}
1.使用enum关键字后,就不能再继承其他类了,因为enum会隐式继承Enum,而JAVA是单继承机制。
2.枚举类和普通类一样,可以实现接口。
enum 类名implements 接口1,接口2{};
注解(Annotation)也被称为元数据,用于修饰解释,包,类,方法,属性,构造器,局部变量的数据信息。
和注释一样,不影响程序的逻辑,但注解可以被编译和运行,相当于嵌入在代码中的补充信息。
使用Annotation时要在前面加@符号,并把Annotation当成修饰符使用,用于修饰它支持的程序元素。
三个基本的Annotation:
1.@Override :限定某个方法,是重写父类方法,该注解只能用于方法。
说明:如果使用了@Override,则接下来的方法必须重写父类方法,如果没有,那么编译器会报错。
//@Override的源码 @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE)public @interfaceOverride{}
注意:@interface表示一个注解类,不是接口。
@Target是修饰注解的注解,称为元注解。
2.@Deprecated : 用于表示某个程序元素(类,方法等)已经过时。
package annotation_;publicclassdeprecated_{publicstaticvoidmain(String[] args){//A上出现一个横线,表示过时,不推荐使用,但是仍可以使用A a=newA();}} @DeprecatedclassA{public int n1;}
@Deprecated可以用作JDK新旧版本的兼容和过渡使用。
3.@SuppressWarnings : 抑制编译器警告。
package annotation_;import java.util.ArrayList;import java.util.List; @SuppressWarnings({"all"})publicclassSuppressWarnings_{publicstaticvoidmain(String[] args){ int i=0; List list=newArrayList(); list.add("jack");}}//作用的类型TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE//可以传入一个数组/* @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); } */
JDK 的元 Annotation 用于修饰其他 Annotation,可以增强对源代码的理解
元注解的种类:
(1) Retention //指定注解的作用范围,三种 SOURCE,CLASS,RUNTIME
(2) Target // 指定注解可以在哪些地方使用
(3) Documented //指定该注解是否会在 javadoc 体现
(4) Inherited //子类会继承父类注解
说明只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:
@Retention 的三种值
(1) RetentionPolicy.SOURCE: 编译器使用后,直接丢弃这种策略的注释
(2) RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解。 这是默认值
(3) RetentionPolicy.RUNTIME:编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以 通过反射获取该注解
用于指定被元注解修饰的注解类将被javadoc工具提取成文档,即在生成文档时,可以看到该注解。
定义Documented的注解的Rentention必须设置为RUNTIME