Java 枚举

2021-03-01 13:26

阅读:953

标签:class   pre   key   -o   red   color   port   cas   例子   

Java 枚举

Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。

Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

例如定义一个颜色的枚举类。

enum Color 
{ 
    RED, GREEN, BLUE; 
} 

以上枚举类 Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色。

枚举特性

enum枚举这个类比较有意思,当你创建完enum后,编译器会自动为你的enum添加toString()方法,能够让你方便的显示enum实例的具体名字是什么。除了 tostring()方法外,编译器还会添加ordinal()方法,这个方法用来表示enum常量的声明顺序,以及values()方法显示顺序的值。

enum可以进行静态导入包,静态导入包可以做到不用输入枚举类名.常量,可以直接使用常量。使用 enum和关键字可以做到静态导入包。

例子:

import static com.company.Color.*;

public class EnumUse {
    public static void main(String[] args) {
        Color color=RED;
    }
}

枚举的使用

外部类中使用枚举

例子:

enum Color
{
  RED, GREEN, BLUE;
}
 
public class Test
{
  // 执行输出结果
  public static void main(String[] args)
  {
    Color c1 = Color.RED;
    System.out.println(c1);
  }
}

执行以上代码输出结果为:

RED

内部类中使用枚举

枚举类也可以声明在内部类中。

例子:

 
public class Test
{
    enum Color
	{
  		RED, GREEN, BLUE;
	}
  // 执行输出结果
  public static void main(String[] args)
  {
    Color c1 = Color.RED;
    System.out.println(c1);
  }
}

执行以上代码输出结果为:

RED

每个枚举都是通过 Class 在内部实现的,且所有的枚举值都是 public static final 的。

以上的枚举类 Color 转化在内部类实现:

class Color
{
     public static final Color RED = new Color();
     public static final Color BLUE = new Color();
     public static final Color GREEN = new Color();
}

迭代枚举元素

可以使用 for 语句来迭代枚举元素。

例子:

enum Color
{
  RED, GREEN, BLUE;
}
public class MyClass {
	public static void main(String[] args) {
		for (Color myVar : Color.values()) {
			System.out.println(myVar);
		}
	}
}

执行以上代码输出结果为:

RED
GREEN
BLUE

在 switch 中使用枚举类

枚举类常应用于 switch 语句中。

例子:

enum Color
{
  RED, GREEN, BLUE;
}
public class MyClass {
	public static void main(String[] args) {
		Color myVar = Color.BLUE;
		switch(myVar) {
            case RED:
                System.out.println("红色");
                break;
            case GREEN:
                System.out.println("绿色");
                break;
            case BLUE:
                System.out.println("蓝色");
                break;
        }
    }
}

执行以上代码输出结果为:

蓝色

values(), ordinal() 和 valueOf() 方法

enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口。

values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:

  • values() 返回枚举类中所有的值。
  • ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
  • valueOf()方法返回指定字符串值的枚举常量。

枚举类

枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。

枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。

枚举类和普通类的区别:

1、枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了 java. lang Enum类,而不是默认继承 Object类,因此枚举类不能显式继承其他父类。其中 java. lang Enum类实现了java. lang Serializable和 java. lang. Comparable两个接口。

2、使用enum定义、非抽象的枚举类默认会使用 final修饰,因此枚举类不能派生子类。

3、枚举类的构造器只能使用 private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定 private修饰符。

4、枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加 public static final修饰,无须程序员显式添加

除此之外,enum还和 Class类有交集,在Cass类中有三个关于Enum的方法

getEnumConstants():T[]
getEnumConstantsShared():T[]
isEnum():boolean

前面两个方法用于获取enum常量,isEnum 用于判断是否是枚举类型的。

除了Enum外,还需要知道两个关于枚举的工具类,一个是EnumSet,一个是EnumMap。

EnumSet和 EnumMap

EnumSet是JDK1.5引入的, EnumSet的设计充分考虑到了速度因素,使用 EnumSet可以作为Enum的替代者,因为它的效率比较高。

EnumMap是一种特殊的Map,它要求其中的key键值是来自一个enum。因为 EnumMap速度也很快,我们可以使用 EnumMap作为key的快速查找。

总的来说,枚举的使用不是很复杂,它也是Java中很小的一块功能,但有时却能够因为这一个小技巧,能够让你的代码变得优雅和整洁。

Java 枚举

标签:class   pre   key   -o   red   color   port   cas   例子   

原文地址:https://www.cnblogs.com/yt0617/p/14443322.html


评论


亲,登录后才可以留言!