📜  Java4/5 枚举

📅  最后修改于: 2020-10-13 06:54:15             🧑  作者: Mango

Java枚举

Java中的Enum是一种数据类型,其中包含一组固定的常量。

它可以用于一周中的几天(周日,周一,周二,周三,周四,周五和周六),方向(北,南,东和西),季节(春季,夏季,冬季和秋季或秋季) ),颜色(红色,黄色,蓝色,绿色,白色和黑色)等。根据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 class
public enum Season { WINTER, SPRING, SUMMER, FALL }
//main method
public static void main(String[] args) {
//traversing the enum
for (Season s : Season.values())
System.out.println(s);
}}

输出:

WINTER
SPRING
SUMMER
FALL

让我们看看Java枚举的另一个示例,其中我们使用Java枚举的value(),valueOf()和ordinal()方法。

class EnumExample1{
//defining enum within class
public enum Season { WINTER, SPRING, SUMMER, FALL }
//creating the main method
public static void main(String[] args) {
//printing all enum
for (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 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);
}} 

输出:

WINTER

Java枚举示例:在类内部定义

class EnumExample3{
enum Season { WINTER, SPRING, SUMMER, FALL; }//semicolon(;) is optional here
public static void main(String[] args) {
Season s=Season.WINTER;//enum type is required to access WINTER
System.out.println(s);
}}

输出:

WINTER

Java枚举示例:枚举内部的main方法

如果将main()方法放在枚举内,则可以直接运行枚举。

enum Season { 
WINTER, SPRING, SUMMER, FALL;
public static void main(String[] args) {
Season s=Season.WINTER;
System.out.println(s);
}
}

输出:

WINTER

初始化枚举常量的特定值

枚举常量的初始值从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
        });
    }
}

我们可以通过new关键字创建Enum的实例吗?

不,因为它仅包含私有构造函数。

枚举中可以有一个抽象方法吗?

当然是!我们可以有抽象方法,并可以提供这些方法的实现。

switch语句中的Java枚举

我们可以在给定的示例中将enum应用于switch语句:

在switch语句上应用Enum的示例


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");
}
}}

输出:

monday