Java Enums
Java中的
Enums是一种数据类型,其中包含一组固定的常量。
它可以用于一周中的几天(周日,周一,周二,周三,周四,周五和周六),方向(北,南,东和西),季节(Spring,夏季) ,冬天和秋天或秋天),颜色(红色,黄色,蓝色,绿色,白色和黑色)等。根据Java的命名约定,所有常量都应使用大写字母。因此,我们有用大写字母表示的枚举常量。
Java枚举可以看作是具有一组固定的常量(不变的变量)的类。 Java枚举常量是静态的,并且是隐式的final。从JDK 1.5开始可用。
枚举用于创建我们自己的数据类型,例如类。
枚举数据类型(也称为枚举数据类型)用于在Java中定义枚举。与C/C ++不同,Java中的枚举更强大。在这里,我们可以在类内部或类外部定义一个枚举。
Java Enum在内部继承了
Enum类,因此它不能继承任何其他类,但是可以实现许多接口。我们可以在Java枚举中包含字段,构造函数,方法和主要方法。
Java枚举要记住的点
枚举可提高类型安全性
枚举可以在开关中轻松使用
可以遍历枚举
枚举可以具有字段,构造函数和方法
Enum可以实现许多接口,但是不能扩展任何类,因为它在内部扩展了Enum类
Java枚举的简单示例
class EnumExample1{
//defining the enum inside the classpublic enum Season {
WINTER, SPRING, SUMMER, FALL }
//main methodpublic static void main(String[] args) {
//traversing the enumfor (Season s : Season.values())System.out.println(s);
}
}
输出:
WINTER
SPRING
SUMMER
FALL
让我们看看Java枚举的另一个示例,其中我们使用Java枚举的value(),valueOf()和ordinal()方法。
class EnumExample1{
//defining enum within classpublic enum Season {
WINTER, SPRING, SUMMER, FALL }
//creating the main methodpublic static void main(String[] args) {
//printing all enumfor (Season s : Season.values()){
System.out.println(s);
}
System.out.println("Value of WINTER is: "+Season.valueOf("WINTER"));
System.out.println("Index of WINTER is: "+Season.valueOf("WINTER").ordinal());
System.out.println("Index of SUMMER is: "+Season.valueOf("SUMMER").ordinal());
}
}
输出:
WINTER
SPRING
SUMMER
FALL
Value of WINTER is: WINTER
Index of WINTER is: 0
Index of SUMMER is: 2
注意: Java编译器在编译时会在枚举内内部添加values(),valueOf()和ordinal()方法。
枚举中values()方法的用途是什么?
Java编译器在内部添加了一个静态类和最终类。创建枚举时的values()方法。 values()方法返回包含枚举的所有值的数组。
枚举中的valueOf()方法的目的是什么?
Java编译器在创建枚举时在内部添加valueOf()方法。 valueOf()方法返回给定常量枚举的值。
枚举中ordinal()方法的用途是什么?
内部Java编译器创建枚举时添加ordinal()方法。 ordinal()方法返回枚举值的索引。
由编译器为上述枚举类型示例生成的内部代码
java编译器在内部创建一个静态且最终的类,该类扩展了Enum类,如以下示例所示:
public static final class EnumExample1$Season extends Enum{
private EnumExample1$Season(String s, int i) {
super(s, i);
}
public static EnumExample1$Season[] values() {
return (EnumExample1$Season[])$VALUES.clone();
}
public static EnumExample1$Season valueOf(String s) {
return (EnumExample1$Season)Enum.valueOf(EnumExample1$Season, s);
}
public static final EnumExample1$Season WINTER;
public static final EnumExample1$Season SPRING;
public static final EnumExample1$Season SUMMER;
public static final EnumExample1$Season FALL;
private static final EnumExample1$Season $VALUES[];
static {
WINTER = new EnumExample1$Season("WINTER", 0);
SPRING = new EnumExample1$Season("SPRING", 1);
SUMMER = new EnumExample1$Season("SUMMER", 2);
FALL = new EnumExample1$Season("FALL", 3);
$VALUES = (new EnumExample1$Season[] {
WINTER, SPRING, SUMMER, FALL }
);
}
}
定义Java枚举
该枚举可以在类的内部或外部定义,因为它类似于类。枚举常量末尾的分号(;)是可选的。例如:
enum Season {
WINTER, SPRING, SUMMER, FALL }
或者,
enum Season {
WINTER, SPRING, SUMMER, FALL;
}
Java枚举的定义相同。
Java枚举示例: 在类外部定义
enum Season {
WINTER, SPRING, SUMMER, FALL }
class EnumExample2{
public static void main(String[] args) {
Season s=Season.WINTER;
System.out.println(s);
}
}
输出:
Java枚举示例: 在类内部定义
class EnumExample3{
enum Season {
WINTER, SPRING, SUMMER, FALL;
}
//semicolon(;
) is optional herepublic static void main(String[] args) {
Season s=Season.WINTER;
//enum type is required to access WINTERSystem.out.println(s);
}
}
输出:
Java枚举示例: 枚举内部的主要方法
如果将main()方法放入枚举,则可以直接运行枚举。
enum Season {
WINTER, SPRING, SUMMER, FALL;
public static void main(String[] args) {
Season s=Season.WINTER;
System.out.println(s);
}
}
输出:
将特定值初始化为枚举常量
枚举常量的初始值从0、1、2、3等开始。但是,我们可以通过定义字段和构造函数来将特定值初始化为枚举常量。如前所述,Enum可以具有字段,构造函数和方法。
为枚举常量指定初始值的示例
class EnumExample4{
enum Season{
WINTER(5), SPRING(10), SUMMER(15), FALL(20);
private int value;
private Season(int value){
this.value=value;
}
}
public static void main(String args[]){
for (Season s : Season.values())System.out.println(s+" "+s.value);
}
}
输出:
WINTER 5
SPRING 10
SUMMER 15
FALL 20
注意: 枚举类型的构造函数是私有的。如果您不声明私有编译器,则会在内部创建私有构造函数。
enum Season{
WINTER(10),SUMMER(20);
private int value;
Season(int value){
this.value=value;
}
}
由编译器为上述枚举类型示例生成的内部代码
final class Season extends Enum{
public static Season[] values() {
return (Season[])$VALUES.clone();
}
public static Season valueOf(String s) {
return (Season)Enum.valueOf(Season, s);
}
private Season(String s, int i, int j) {
super(s, i);
value = j;
}
public static final Season WINTER;
public static final Season SUMMER;
private int value;
private static final Season $VALUES[];
static {
WINTER = new Season("WINTER", 0, 10);
SUMMER = new Season("SUMMER", 1, 20);
$VALUES = (new Season[] {
WINTER, SUMMER }
);
}
}
我们可以通过新关键字创建Enum实例吗?
否,因为它仅包含私有构造函数。
枚举中可以有一个抽象方法吗?
是的,当然可以!我们可以有抽象方法,并可以提供这些方法的实现。
switch语句中的Java枚举
我们可以像给定示例中那样将enum应用于switch语句:
应用示例在switch语句上枚举
class EnumExample5{
enum Day{
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}
public static void main(String args[]){
Day day=Day.MONDAY;
switch(day){
case SUNDAY: System.out.println("sunday");
break;
case MONDAY: System.out.println("monday");
break;
default:System.out.println("other day");
}
}
}
输出: