枚举
1.为什么要有枚举
-
在我们使用一些类的时候,它的对象是固定的,不会有更多,例如,一个季节类,只有春天,夏天,秋天和冬天这四个对象,不能出现更多的对象,但是用类定义的话,我们就可以通过new很多的对象,比如白天,黑天等,但是放在现实中是不科学的m,其他的还有月份,季节等 -
因此我们就有对它进行限制,所以产生了枚举类这个新功能. 所谓枚举(枚: 一个一个 举: 列举)就是一个个的列举出来,也就是把有限的对象列举出来, -
枚举(英文:enumeration)关键字为 enum;
2.自定义枚举
自定义枚举类要注意以下几点:
- 构造器private修饰,(阻止使用者new 对象)
- 去掉相关的Set方法,(不允许其修改属性)
- 在 本类 里面创建固定的对象
- 定义的对象用public static final 修饰,
自定义枚举类代码如下:
package hai.se.day16.dem01;
public class Test01 {
public static void main(String[] args) {
System.out.println(Season.AUTUMN);
System.out.println(Season.SPRING);
System.out.println(Season.WINTER);
System.out.println(Season.SUMMER);
}
}
class Season{
private String name;
private String desc;
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("冬天","寒冷");
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
3.enum关键字实现枚举
如果使用了枚举类的话,要注意以下几点:
- class 关键字用enum代替
- public static final Season SPRING=new Season(“春天”,“温暖”) 用SPRING(“春天”,“温暖”)替代;
- 如果有多个常量(对象)使用 “,” (逗号)间隔即可,最后一个用 " ; "(分号)隔开.
- 如果使用enum实现枚举,要求将定义常量对象写在最前面.
enum关键字实现枚举代码如下:
package hai.se.day16.dem01;
public class Enumeration {
public static void main(String[] args) {
System.out.println(Season1.AUTUMN);
System.out.println(Season1.SPRING);
System.out.println(Season1.SUMMER);
System.out.println(Season1.WINTER);
}
}
enum Season1{
SPRING("春天","温暖"),
SUMMER("夏天","炎日"),
AUTUMN("秋天","凉爽"),
WINTER("冬天","寒冷");
private String name;
private String desc;
private Season1(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
4.enum关键字实现枚举的注意事项
- 使用enum关键字开发一个枚举时,会默认的继承Enum类,
- 使用传统的 public static final Season SPRING=new Season(“春天”,“温暖”); 简化成 SPRING(“春天”,“温暖”),
- 我们必须知道它调用的是那个构造器
- 如果是无参构造创建枚举对象,则实参列表和小括号都可以省略
- 当创建多个枚举对象的时候,使用 逗号 间隔,最后一个用分号结尾.
- 枚举对象必须放在枚举类的首行
知识拓展: enum 会继承Enum类,我们可以使用javap来对枚举类的 .class文件进行反编译,我们可以看到一些enum类中没有定义的方法,这些方法就是Enum 类的方法.,如下图.
5.enum关键字的常用方法
方法的使用代码如下:
package hai.se.day16.dem01;
public class Enumeration {
public static void main(String[] args) {
Season1 autumn = Season1.AUTUMN;
System.out.println(autumn.name());
System.out.println(autumn.ordinal());
for (Season1 value : Season1.values()) {
System.out.println(value);
}
Season1 autumn1 = Season1.valueOf("AUTUMN");
System.out.println("autumn1"+autumn1);
System.out.println(Season1.AUTUMN.compareTo(Season1.SUMMER));
}
}
enum Season1{
SPRING("春天","温暖"),
SUMMER("夏天","炎日"),
AUTUMN("秋天","凉爽"),
WINTER("冬天","寒冷");
private String name;
private String desc;
private Season1(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
注解
- 注解(Annotation)也成为称为元数据(Metadata),用于修饰解释,包,类,方法,构造器,局部变量等信息.
- 和注释一样,注解不影响程序逻辑,单注解可以被编译或运行,相当于嵌入在代码中的补充信息.
- 在javaSE中,注解的使用目的比较简单,例如标记过时功能,忽略警告等.在javaEE中注解占据了重要的角色,例如用来配置应用程序的任何切面,代替 java EE 旧版汇中所遗留的代码冗余和XML配置等.
1.@oberride注解
限定某个方法,是重写父类方法,该注解只能用于方法.
- 对于@override注解,写了还是没写,都表示重写父类的方法,但是写了,编译器就会检查该方法是否是重写父类的方法,如果确实重写了,则编译通过,否则不通过.
- 如果发现 @Interface 表示一个注解类
- @Target 是修饰注解的注解,也称为元注解
2.@deprecated注解
用于表示某个程序元素(类和方法)已过时,
- 表示过时的,不推荐使用,但是还是可以使用
- 可以修饰类,方法,字段,包,参数,等等
- 可以用于版本的升级过度.
3.@supresswarnings
抑制编译器警告.
元注解
所谓元注解就是对注解进行注解
1.元注解的种类(使用不多,了解)
- Retention //指定注解的作用范围,三种,SOURCE,CLASS,RUNTIME.
- Target //指定注解可以在那些地方使用
- Documented //指定该注解是否会在javadoc中体现.
- Inherited //子类会继承父类的注解
2.@Retention注解
只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间,@Retention包含一个RetentionPolicy类型的成员变量,使用Retention时必须为该value成员变量指定值.
Retention的三种值:
- RetentionPolicy.SOURCE编译使用后,直接丢弃 这种策略的注释
- RetentionPolicy.CLASS编译器将把注释记录在Class文件中 ,当运行java程序时,JVM不会保留注解, 这是默认值
3)RetentionPolicy.RUNTIME编译器将把注解记录在Class文件中 ,当运行java程序时,JVM会保留注解
2 @Target
指定注解可以在那些地方使用
3.@Documented
指定该注解是否会在javadoc中体现,会被Annotation类将被javadoc工具提取成文档,即在生成该文档时,可以看到该注解.
4.@Inherited
被他修饰的Annotation将具有继承性,如果某个类被@Inherited修饰,其子类将自动具有该注解.
|