Java基础知识13-枚举

枚举

从 JDK 5 开始, 枚举被添加到了 Java 语言中, 和其它语言中的描述相似, 但是这种相似只是表面上的.

枚举的基础知识

创建枚举需要使用 enum 关键字, 例如:

enum Apple {
  Jonathan, GoldenDel, RedDel, Winesap, Cortland
}

标识符 Jonathan, GoldenDel 等被称为枚举常量. 每个枚举常量被隐式声明为 Apple 的公有,静态 final 成员.

此外, 枚举常量的类型是声明它们的枚举类型, 对于这个例子为 Apple.

定义了枚举之后, 可以创建枚举类型的变量. 但是, 尽管枚举定义了类类型, 却不能使用 new 实例化枚举. 反而, 枚举变量的声明和使用方式在许多方面与基本类型相同.

下面这行代码将 ap 声明为 Apple 枚举类型的变量:

Apple ap;

因为 ap 是 Apple 类型, 所以只能被赋值为(或包含)在 Apple 枚举中定义的那些值.

例如, 下面这行代码将 ap 赋值为 RedDel;

ap = Apple.RedDel;

可以使用关系运算符 == 比较两个枚举常量的相等性. 例如, 下面这条语句比较 ap 的值和 GoldenDel 常量:

if (ap == Apple. GoldenDel) // ...

枚举值也可以用于控制 switch 语句. 当然, 所有的 case 语句使用的常量的枚举类型, 都必须与 switch 表达式使用的枚举类型相同.

switch (ap) {
  case Jonathan:
    // ...
  case Winesap:
    // ...

注意在 case 语句中, 枚举常量的名称没有使用枚举类型的名称进行限定. 也就是说, 使用的是 Winesap 而不是 Apple.Winesap.
这是因为 switch 表达式中的枚举类型已经隐式指定了 case 常量的枚举类型, 所以在 case 语句中不需要使用枚举类型的名称对常量进行限定. 实际上, 如果试图这么做的话, 会造成编译时错误.

values() 和 valuesOf() 方法

所有枚举都自动包含两个预定义方法: values() 和 valuesOf() 方法. 它们的一般形式如下所示:

public static enum-type [ ] values()
public static enum-type valueOf(String str)

values() 方法返回一个包含枚举常量列表的数据, valueOf()方法返回与传递到参数 str 的字符串相对应的常量.

Java 枚举是类类型

Java 枚举是类类型. 虽然不能使用 new 实例化枚举, 但是枚举却又许多和类相同的功能.

枚举定义了类, 这为 Java 枚举提供了超乎寻常的功能. 例如, 可以为枚举提供构造函数, 添加实例变量和方法, 甚至可以实现接口.

需要理解的重要一点是: 每个枚举常量都是枚举类型的对象. 因此, 如果为枚举定义了构造函数, 那么当创建每个枚举常量时都会调用该构造函数.

分析下面 Apple 枚举:

enum Apple{
  Jonathan(10), GoldenDel(9), RedDel(20), Winesap(15), Cortland(8);
  
  private int price;
  
  Apple(int p) { price = p;}

  int getPrice() { return price; }
}

这个版本的 Apple 枚举添加了三个内容: 第一个内容是实例变量 price, 用于保存每种苹果的价格; 第二个内容是 Apple 构造函数, 它以苹果的价格作为参数; 第三个内容是 getPrice() 方法, 用于返回 Price 变量的值.

当在 main() 方法中声明变量 ap 时, 对于每个特定的常量调用 Apple 构造函数一次.

注意指定构造函数参数的方式, 通过将它们放置到每个常量后面的圆括号中来加以指定, 如下所示:

Jonathan(10), GoldenDel(9), RedDel(20), Winesap(15), Cortland(8);

这些数值被传递给 Apple() 的参数 p, 然后将这些值赋值给 price 变量. 再强调一次, 为每个常量调用构造函数一次.

因为每个枚举常量都有自己的 price 变量副本, 所以可以调用 getPrice() 方法来获取指定类型苹果的价格.

Apple.Winesap.getPrice();

枚举继承自 Enum 类

尽管声明枚举时不能继承超类, 但是所有枚举都自动继承超类 java.lang.Enum , 这个类定义了所有枚举都可以使用的一些方法.

可以获取用于指示枚举常量在常量列表中位置的值, 这种称为枚举常量的序数值. 通过 ordinal() 方法可以检索序数值, 该方法的声明如下所示:

final int ordinal();

该方法返回调用常量的序数值, 序数值从0开始. 因此 Apple 枚举中, Jonathan 的序数值为 0, GoldenDel 的序数值为 1.

可以使用 compareTo() 方法比较相同类型的两个枚举常量的序数值, 该方法的一半形式如下:

final int compareTo( enum-type e );

其中, enum-tpye 是枚举的类型, e 是和调用常量进行比较的常量. 请记住, 调用常量和 e 必须是相同的枚举.

如果调用常量的序数值小于 e 的序数值, 那么 compareTo() 方法返回负值; 如果两个序数值相同, 返回0; 如果调用常量的序数值大于 e 序数值, 就返回正值.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容