【JAVA基础】枚举

枚举

将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用;

枚举基本特性

以下代码是枚举的简单使用:

使用values方法返回enum实例的数组

使用ordinal方法返回每个enum实例的次序,从0开始

使用compareTo方法比较两个enum实例

使用==来比较enum实例

使用getDeclaringClass方法返回enum实例所属的enum类

使用valueOf方法根据指定的名字返回enum实例

package enumerated;

enum Shrubbery {
    GROUND, CRAWLING, HANGING
}

public class EnumClass {
    public static void main(String[] args) {
        for (Shrubbery s : Shrubbery.values()) {
            System.out.println(s + " ordinal: " + s.ordinal());
            System.out.println(s.compareTo(Shrubbery.CRAWLING) + " ");
            System.out.println(s.equals(Shrubbery.CRAWLING) + " ");
            System.out.println(s == Shrubbery.CRAWLING);
            System.out.println(s.getDeclaringClass());
            System.out.println(s.name());
            System.out.println("----------------------");
        }
        // Produce an enum value from a string name:
        for (String s : "HANGING CRAWLING GROUND".split(" ")) {
            Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);
            System.out.println(shrub);
        }
    }
}

注意枚举enum默认是继承自java.lang.Enum类的,在以上代码中,Shrubber为一个枚举类, GROUND, CRAWLING, HANGING为这个enum类的实例,由于Shrubber已经继承自java.lang.Enum类,所以它是不能在继承其它enum类;

另外,在使用枚举的时候,可以考虑使用静态导入枚举类型,省去使用枚举类型修饰枚举实例;

向enum中添加方法

enum基本上是可以被看做一个常规的类,可以向其添加方法,甚至main方法;

如下代码,在枚举类内部添加一个构造方法和getDescription方法, 注意,当定义自己方法的时候,需要在enum实例序列的最后一个后面添加分号,且要先定义enum实例再定义方法;

package enumerated;

public enum OzWitch {
    // Instances must be defined first, before methods:
    WEST("Miss Gulch, aka the Wicked Witch of the West"),
    NORTH("Glinda, the Good Witch of the North"),
    EAST("Wicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy‘s house"),
    SOUTH("Good by inference, but missing");
    private String description;

    // Constructor must be package or private access:
    private OzWitch(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public static void main(String[] args) {
        for (OzWitch witch : OzWitch.values())
            System.out.println(witch + ": " + witch.getDescription());
    }
}

再看一个例子,覆盖Enum类的方法,如下代码,覆盖toString方法,将枚举的name首字母大写,其余转为小写,:

package enumerated;

public enum SpaceShip {
    SCOUT, CARGO, TRANSPORT, CRUISER, BATTLESHIP, MOTHERSHIP;
    public String toString() {
        String id = name();
        String lower = id.substring(1).toLowerCase();
        return id.charAt(0) + lower;
    }

    public static void main(String[] args) {
        for (SpaceShip s : values()) {
            System.out.println(s);
        }
    }
}

在switch中使用枚举

如下代码是枚举在switch语句中的使用,注意在case语句里,枚举实例前面是不需要写上枚举类型的,强行写上(如Signal.RED)编译器会报错;

package enumerated;

// Define an enum type:
enum Signal {
    GREEN, YELLOW, RED,
}

public class TrafficLight {
    Signal color = Signal.RED;

    public void change() {
        switch (color) {
        // Note that you don‘t have to say Signal.RED
        // in the case statement:
        case RED:
            color = Signal.GREEN;
            break;
        case GREEN:
            color = Signal.YELLOW;
            break;
        case YELLOW:
            color = Signal.RED;
            break;
        }
    }

    public String toString() {
        return "The traffic light is " + color;
    }

    public static void main(String[] args) {
        TrafficLight t = new TrafficLight();
        for (int i = 0; i < 7; i++) {
            System.out.println(t);
            t.change();
        }
    }
}

关于枚举中的values()方法

我们已经知道枚举类是继承java.lang.Enum类的,但是查看Enum源代码却没有发现有values()方法,那么values()方法是哪里来的呢?

答案是,values()方法是由编译器添加的静态方法,有兴趣可以利用反射机制去查看,如上面的例子,可以编写如下代码查看:

Method[] methods = Signal.class.getMethods();

参考资料:JAVA编程思想--4

时间: 2024-08-09 04:02:29

【JAVA基础】枚举的相关文章

JAVA基础——枚举详解

前言: 在第一次学习面向对象编程时,我记得最深的一句话就是"万物皆对象".于是我一直秉承着这个思想努力的学习着JAVA,直到学习到枚举(Enum)时,看着它颇为奇怪的语法--我一直在想,这TM是个什么鬼???当时学习OOP时也是被类啊接口什么的整的有点昏头转向的于是就把这个小细节忽略掉了.后来到了公司工作后慢慢的又需要用上枚举了,看着它一副神秘兮兮的样子我还是决定要好好的深挖一下!以下链接是了解枚举时所参考的博客.如发现本文有错误或知识遗漏欢迎在评论中指正! 反编译那些事儿(二)-枚举

[Java 基础]枚举

概念 枚举(enum)是一个被命名的整型常量的集合. enum相对于普通常量最明显的好处在于更有组织性. 尽管enum看起来像是一种新的数据类型,事实上,enum是一种受限制的类,并且具有自己的方法. 创建enum时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum. java.lang.Enum类声明: public abstract class Enum<E extends Enum<E>> implements Comparable<E>,

Java基础——枚举与注解

枚举类: 1.自定义枚举类 1.提供类的属性,声明为private final 2.声明为final的属性,在构造器中初始化,私有化构造器, 保证不能在类的外部创建其对象 3.通过公共的方法调用属性 4.创建枚举类的对象:将类的对象声明为public static final 2.关键字 enum定义枚举类 1.enum中的常用方法 (1)values();//以数组的形式返回整个枚举类型的所有的对象 Season[] seasons = Season.values();//返回的是一个数组 (

【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-import.html#1.2.values方法的使用: Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由arthinking发表于4年前 | Java基础 | 暂无评论 |  被围观 8,332 views+ 1.枚举(Enum):1.1.枚举类型中的两个静态方法:1.2.values方法的使用:

Java基础15:深入剖析Java枚举类

Java基础15:深入剖析Java枚举类 枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示. 初探枚举类 在程序设计中,有时会用到由若干个有限数据元素组成的集合,如一周内的星期一到星期日七个数据元素组成的集合,由三种颜色红.黄.绿组成的集合,一个工作班组内十个职工组成的集合等等,程序中某个变量取值仅限于集合中的元素.此时,可将这些数据集合定义为枚举类型. 因此,枚举类型是某类数据可能取值的集合,如一周内星期可能取值的

Java基础教程:枚举类型

Java基础教程:枚举类型 枚举类型 枚举是将一具有类似特性的值归纳在一起的方法.比如,我们可以将周一到周日设计为一个枚举类型.彩虹的七种颜色设计为一个枚举类型. 常量实现枚举 我们通过定义常量的方式来实现,如下: Public static class RainbowColor { // 红橙黄绿青蓝紫七种颜色的常量定义 public static final int RED = 0; public static final int ORANGE = 1; public static fina

Java基础:枚举Enum

在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象:春.夏.秋.冬.这种实例有限而且固定的类,在Java里被称为枚举类. 1 手动实现枚举类 示例: package com.demo2; public class Season { public static final Season SPRING = new Season("春天", "趁春踏青"); public static final Season SUMMER = new Season(

第3篇-JAVA基础

第3篇-JAVA基础 每篇一句 :目标是给梦想一个期限,行动与坚持就是实现梦想的过程 初学心得: 遇到困难或问题,它不是休止符,而是引向你如何解决问题的标识 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-03-26| JAVA基础 Ⅱ] 上篇回顾 上篇文章中我们学习了JAVA底层的运行机制与深入剖析以及解释其中JAVA基础代码的含义 本篇文章将JAVA基础Ⅱ全面剖析解释,因为JAVA基础非常重要,务必要牢记知识点!!! 1.JAVA基础语法格式 JAVA采用unicode编码 1

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

java基础问题总结

1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派生类可以从它的基类那里继承方法和实例变量,并