步骤:
1.不需要提供setxxx方法,因为枚举对象的属性只需读。
2.对枚举对象使用 final + static修饰,实现底层优化。
3.枚举对象名通常全部使用大写,这是一个命名规范。
4.构造器私有化,但是对象向外暴露。
package Enum; public class DefineMyself { public static void main(String[] args) { System.out.println(Season.SPRING); System.out.println(Season.SUMMER); } } class Season{ private String name ; private String weather; public static final Season SPRING = new Season("春天","温暖"); public static final Season SUMMER = new Season("夏天","炎热"); private Season(String name, String weather) { this.name = name; this.weather = weather; } public String getName() { return name; } public String getWeather() { return weather; } @Override public String toString() { return "Season{" + "name='" + name + '\'' + ", weather='" + weather + '\'' + '}'; } }
1.但我们使用enum关键字来创建一个枚举类时,默认会继承Enum类,同时该类使用了final修饰。
2.传统的 public static final Season SPRING = new Season(“春天”,“温暖”); 变成了SPRING(“春天”,“温暖”),我们要注意它调用的是哪一个构造器。
3.如果调用的是无参构造器创建的枚举对象,则实参列表和小括号都可以省略。
枚举对象必须放在枚举类的首行。
package Enum; public class DefineMyself { public static void main(String[] args) { System.out.println(Season.SPRING); System.out.println(Season.SUMMER); } } enum Season{ SPRING("春天","温暖"), SUMMER("夏天","炎热"); public String name ; public String weather; private Season(String name, String weather) { this.name = name; this.weather = weather; } public String getName() { return name; } public String getWeather() { return weather; } @Override public String toString() { return "Season{" + "name='" + name + '\'' + ", weather='" + weather + '\'' + '}'; } }
注意使用enum关键字创建枚举类时对象依然有 static 和 final 修饰
values : 返回当前枚举类中的所有常量。返回的是一个数组。
class Untitled { public static void main(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; private Season(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 @interface Override { }
注意:@interface表示一个注解类,不是接口。
@Target是修饰注解的注解,称为元注解。
2.@Deprecated : 用于表示某个程序元素(类,方法等)已经过时。
package annotation_; public class deprecated_ { public static void main(String[] args) { //A上出现一个横线,表示过时,不推荐使用,但是仍可以使用 A a = new A(); } } @Deprecated class A{ public int n1; }
@Deprecated可以用作JDK新旧版本的兼容和过渡使用。
3.@SuppressWarnings : 抑制编译器警告。
package annotation_; import java.util.ArrayList; import java.util.List; @SuppressWarnings({"all"}) public class SuppressWarnings_ { public static void main(String[] args) { int i = 0; List list = new ArrayList(); 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